Setup

# load libraries
library(tidyverse)
library(psych)
library(langcog) # source: https://github.com/langcog/langcog
library(RColorBrewer)
library(plotly)
library(lubridate)
library(rms)
library(lme4)
# clear workspace
rm(list = ls(all = T))
graphics.off()
# make rounding function
round2 <- function(x) {format(round(x, 2), nsmall = 2)}
# make cleanup function
cleanup <- function(datasource, age_group) {
  if(grepl("adult", age_group)) {
    
    # set target dataset
    if(datasource == "study 1"){d <- d_raw_study1}
    if(datasource == "study 1b"){d <- d_raw_study1b}
    if(datasource == "study 1c"){d <- d_raw_study1c}
    
    # enact exclusionary criteria
    d_clean_1 <- d
    
    # recode background and demographic variables
    d_clean <- d_clean_1 %>%
      mutate( # deal with study number
        study = factor(study)) %>%
      mutate( # deal with race
        race_cat2 = factor(sub(" +$", "", ethnicity)),
        race_cat3 = factor(ifelse(grepl(" ", race_cat2) == T, "multiracial",
                                  as.character(race_cat2)))) %>%
      dplyr::select(study, subid:country_selfrep, age_group, race_cat3) %>%
      rename(race_cat = race_cat3) %>%
      mutate( # deal with religion (note: only dealing with childhood religion for now)
        religion_cat2 = factor(sub(" +$", "", religionChild)),
        religion_cat3 = factor(ifelse(grepl(" ", religion_cat2) == T, 
                                      "multireligious",
                                      as.character(religion_cat2)))) %>%
      dplyr::select(study:race_cat, religion_cat3) %>%
      rename(religion_cat = religion_cat3)
    
    # remove extraneous dfs and variables
    rm(d, d_clean_1)
  }
  
  if(grepl("child", age_group)) {
    
    # set target dataset
    if(datasource == "study 2"){d <- d_raw_study2}
    if(datasource == "study 3"){d <- d_raw_study3}
    if(datasource == "study 4"){d <- d_raw_study4}
    if(datasource == "study 5"){d <- d_raw_study5}
    
    # recode background and demographic variables
    d_clean_2 <- d %>%
      mutate( # deal with study number
        study = factor(study),
        responseNum = ifelse(!is.na(responseNum), responseNum,
                             ifelse(response == "no", 0, 
                                    ifelse(response == "kinda", 0.5, 
                                           ifelse(response == "yes", 1, NA)))))
    # NOTE: need to reconcile race/ethnicity at some point...
    # NOTE: need to deal with gender at some point...
  
    d_clean <- d_clean_2
    
    # remove extraneous dfs and variables
    rm(d, d_clean_2)
  }
  
  # remove outliers if desired
  if(chosenOutlierHandling == "remove") {
    
    d_clean <- d_clean %>%
      gather(capacity, score, happy:pride) %>%
      group_by(character, capacity) %>%
      filter(!score %in% boxplot.stats(score, 2.5)$out) %>%
      spread(capacity, score) %>%
      arrange(character, subid)
    
  }
  
  # filter characters if desired
  if(is.element("none", chosenExclude)) {} else {
    
    d_clean <- d_clean %>%
      filter(!character %in% chosenExclude)
    
    }
    
  # filter items if desired
  if(is.element("none", chosenExcludeItem)) {} else {
    d_clean <- d_clean %>%
      dplyr::filter(!capacity %in% chosenExcludeItem)
  }
  
  # drop trials <250 ms
  d_clean <- d_clean %>%
    filter(rt >= 250 | is.na(rt))
  
  # center response variable
  if(datasource == "study 1b") {
    d_clean <- d_clean %>%
      mutate(responseNumC = responseNum - 4)
  } else {
    d_clean <- d_clean %>%
      mutate(responseNumC = responseNum - 0.5)
  }
    # rename character name variables
  if("charName" %in% names(d_clean)) {
    d_clean <- d_clean %>% rename(character = charName)
  }
  
  # cleanup
  d_clean <- d_clean %>%
    filter(!is.na(subid), !is.na(character), !is.na(capacity))
  
  # return cleaned dataset
  return(d_clean)
}
# make function for stripping dataframes for dimension reducation
makeDRDF <- function(datasource, chosenCondition) {
  
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2}
  if(datasource == "study 3"){d <- d3}
  if(datasource == "study 4"){d <- d4}
  if(datasource == "study 5"){d <- d5}
  # filter by character if specified
  if(chosenCondition %in% c("beetle", "robot")) {
    d <- d %>% filter(character == chosenCondition)
  }
  # make stripped dataframe for dimension reducation analyses
  d_strip <- d %>%
    filter(!is.na(character), !is.na(subid), !is.na(capacity), capacity != "") %>%
    mutate(subid = paste(character, subid, sep = "_")) %>%
    select(subid, capacity, responseNum) %>%
    spread(capacity, responseNum) %>%
    remove_rownames() %>%
    column_to_rownames(var = "subid")
  # return stripped dataframe
  return(d_strip)
}
# make demographics functions
demoSampleSize <- function(datasource) {
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2}
  if(datasource == "study 3"){d <- d3}
  if(datasource == "study 4"){d <- d4}
  if(datasource == "study 5"){d <- d5}
  # get distinct subids
  sample_size <- d %>% distinct(subid, character) %>% count(character) %>% data.frame()
  # add total sample size  
  sample_size <- rbind(sample_size %>% mutate(character = as.character(character)),
                       c(character = "all", n = d %>% distinct(subid) %>% count() %>% as.numeric()))
  
  # return dataframe
  return(sample_size)
}
demoDuration <- function(datasource) {
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2}
  if(datasource == "study 3"){d <- d3}
  if(datasource == "study 4"){d <- d4}
  if(datasource == "study 5"){d <- d5}
  # get sample size per character
  duration <- d %>%
    distinct(subid, character, duration) %>%
    mutate(duration = as.numeric(duration)) %>%
    group_by(character) %>%
    summarise(min_duration = min(duration, na.rm = T),
              max_duration = max(duration, na.rm = T),
              median_duration = median(duration, na.rm = T),
              mean_duration = mean(duration, na.rm = T),
              sd_duration = sd(duration, na.rm = T))
  # add total duration
  all <- d %>%
    distinct(subid, character, duration) %>%
    mutate(duration = as.numeric(duration)) %>%
    summarise(min_duration = min(duration, na.rm = T),
              max_duration = max(duration, na.rm = T),
              median_duration = median(duration, na.rm = T),
              mean_duration = mean(duration, na.rm = T),
              sd_duration = sd(duration, na.rm = T)) %>%
    mutate(character = "all")
  
  duration <- rbind(duration, all) # not sure why full_join doesn't work    
  # return dataframe
  return(duration)
}
demoAge <- function(datasource) {
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2}
  if(datasource == "study 3"){d <- d3}
  if(datasource == "study 4"){d <- d4}
  if(datasource == "study 5"){d <- d5}
  # get sample size per character
  age <- d %>%
    distinct(subid, character, age) %>%
    mutate(age = as.numeric(age)) %>%
    group_by(character) %>%
    summarise(min_age = min(age, na.rm = T),
              max_age = max(age, na.rm = T),
              median_age = median(age, na.rm = T),
              mean_age = mean(age, na.rm = T),
              sd_age = sd(age, na.rm = T))
  # add total age
  all <- d %>%
    distinct(subid, character, age) %>%
    mutate(age = as.numeric(age)) %>%
    summarise(min_age = min(age, na.rm = T),
              max_age = max(age, na.rm = T),
              median_age = median(age, na.rm = T),
              mean_age = mean(age, na.rm = T),
              sd_age = sd(age, na.rm = T)) %>%
    mutate(character = "all")
  age <- full_join(age, all)
  # return dataframe
  return(age)
}
demoGender <- function(datasource) {
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2}
  if(datasource == "study 3"){d <- d3}
  if(datasource == "study 4"){d <- d4}
  if(datasource == "study 5"){d <- d5}
  # get gender per character and overall
  gender <- data.frame(addmargins(with(d %>% distinct(subid, character, gender), 
                                       table(character, gender)))) %>%
    filter(gender != "Sum") %>%
    rename(n = Freq)
  
  gender <- gender %>%
    mutate(character = factor(ifelse(character == "Sum",
                                     "all", as.character(character)),
                              levels = c("beetle", "robot", "all"))) %>%
    arrange(character, gender) %>%
    spread(gender, n)
  
  # return dataframe
  return(gender)
}
demoRace <- function(datasource) {
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2}
  if(datasource == "study 3"){d <- d3}
  if(datasource == "study 4"){d <- d4}
  if(datasource == "study 5"){d <- d5}
  # get race per character and overall
  race <- data.frame(addmargins(with(d %>% distinct(subid, character, race_cat), 
                                     table(character, race_cat)))) %>%
    filter(race_cat != "Sum") %>%
    rename(n = Freq)
    race <- race %>%
      mutate(character = factor(ifelse(character == "Sum",
                                       "all", as.character(character)))) %>%
      arrange(character, race_cat) %>%
      spread(race_cat, n)
  
  # return dataframe
  return(race)
}
# plotting functions
makeFacetLabs <- function(df_plotting) {
  facet_labels <- array()
  df_plotting <- df_plotting %>% mutate(character = factor(character))
  for(i in 1:length(levels(df_plotting$character))) {
    df <- df_plotting %>% filter(character == levels(df_plotting$character)[i]) %>%
      select(character, n) %>% unique()
    facet_labels[i] <- paste0(df$character, " (n = ", df$n, ")")
  }
  names(facet_labels) <- levels(df_plotting$character)
  return(facet_labels)
}
# remove outliers?
chosenOutlierHandling <- "keep"
# chosenOutlierHandling <- "remove"
# exclude any conditions (characters)?
chosenExclude <- "none"
# chosenExclude <- c("stapler", "car", "computer")
# exclude any items (mental capacities)?
# chosenExcludeItem <- "none"
# chosenExcludeItem <- "computations"
chosenExcludeItem <- c("metal", "on_off")
# NOTE: always choose minimal residual (fm = "minres") instead of ML because of non-normality
# for EFAs, what kind of correlation?
chosenCorType <- "cor" # pearson correlation
# chosenCorType <- "poly" # polychoric correlation
# for EFAs, what kind of rotation?
# chosenRotType <- "varimax" # varimax rotation
chosenRotType <- "oblimin" # oblimin rotation
# chosenRotType <- "none" # no rotation
data.frame("conditionsExcluded" = chosenExclude,
           "outlierHandling" = chosenOutlierHandling,
           "EFA_correlation" = chosenCorType,
           "EFA_rotation" = chosenRotType)

back to TOC

Data preparation

# study 1 (2016-07-06, adults, 2 conditions, 3-point scale, "decide what to do" and "make plans")
d_raw_study1 <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/adults/us_run-01_2016-06-05_anonymized.csv") %>%
  mutate(study = "study 1", age_group = "adults") %>% select(-X)
# study 1b (2017-07-19, adults, 2 conditions, 7-point scale, "decide what to do" and "make plans")
d_raw_study1b <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/adults/us_run-02_2016-07-19_anonymized.csv") %>%
  mutate(study = "study 1b", age_group = "adults") %>% select(-X)
# study 1c (2016-12-08, adults, 2 conditions, 3-point scale, "have free will" and "have intentions")
d_raw_study1c <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/adults/us_run-03_2016-12-08_anonymized.csv") %>%
  mutate(study = "study 1c", age_group = "adults") %>% select(-X)
# study 2 (June - December 2016, 7-9yo, 2 conditions, 3-point-scale, "decide what to do" and "make plans")
d_raw_study2 <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/children/run-01_2017-07-24_anonymized.csv") %>%
  mutate(study = "study 2", age_group = "children_79") %>% select(-X)
# study 3 (January - June 2017, 7-9yo, 9 conditions, 3-point-scale, "decide what to do" and "make plans")
d_raw_study3 <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/children/run-02_2017-08-08_anonymized.csv") %>%
  mutate(study = "study 3", age_group = "children_79") %>% select(-X) %>%
  mutate(dob = parse_datetime(dateOfBirth, "%m/%d/%y"),
         dot = parse_datetime(gsub("2017", "17", dateOfTest), "%m/%d/%y"), 
         age = interval(start = dob, end = dot) / duration(num = 1, units = "years")) %>%
  select(-dateOfBirth, -dateOfTest, -dob, -dot)
220 parsing failures.
row # A tibble: 5 x 4 col     row   col           expected actual expected   <int> <int>              <chr>  <chr> actual 1   301    NA date like %m/%d/%y Jun-07 row 2   302    NA date like %m/%d/%y Jun-07 col 3   303    NA date like %m/%d/%y Jun-07 expected 4   304    NA date like %m/%d/%y Jun-07 actual 5   305    NA date like %m/%d/%y Jun-07
... ................. ... ....................................... ........ ....................................... ...... ....................................... ... ....................................... ... ....................................... ........ ....................................... ...... .......................................
See problems(...) for more details.
# study 4 (May 2017 - present, 4-6yo, 9 conditions, 3-point-scale, "decide what to do" and "make plans")
d_raw_study4 <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/children/run-03_2017-08-21_anonymized.csv") %>%
  mutate(study = "study 4", age_group = "children_46") %>% select(-X) %>%
  mutate(dob = parse_datetime(dateOfBirth, "%m/%d/%y"),
         dot = parse_datetime(gsub("2017", "17", dateOfTest), "%m/%d/%y"), 
         age = interval(start = dob, end = dot) / duration(num = 1, units = "years")) %>%
  select(-dateOfBirth, -dateOfTest, -dob, -dot)
20 parsing failures.
row # A tibble: 5 x 4 col     row   col           expected                             actual expected   <int> <int>              <chr>                              <chr> actual 1  2229    NA date like %m/%d/%y **parent but birth date as 8/23/17 row 2  2230    NA date like %m/%d/%y **parent but birth date as 8/23/17 col 3  2231    NA date like %m/%d/%y **parent but birth date as 8/23/17 expected 4  2232    NA date like %m/%d/%y **parent but birth date as 8/23/17 actual 5  2233    NA date like %m/%d/%y **parent but birth date as 8/23/17
... ................. ... ................................................................... ........ ................................................................... ...... ................................................................... ... ................................................................... ... ................................................................... ........ ................................................................... ...... ...................................................................
See problems(...) for more details.
# study 5 (Fall 2017 - present, 5.5-7.5yo (plus), 9 conditions, 3-point-scale, "decide what to do" and "make plans")
d_raw_study5 <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/children/run-04_2017-10-10_anonymized.csv") %>%
  mutate(study = "study 5", age_group = "children_5.57.5") %>% select(-X) %>%
  mutate(dob = parse_datetime(dateOfBirth, "%m/%d/%y"),
         dot = parse_datetime(gsub("2017", "17", dateOfTest), "%m/%d/%y"), 
         age = interval(start = dob, end = dot) / duration(num = 1, units = "years")) %>%
  select(-dateOfBirth, -dateOfTest, -dob, -dot)
# clean up datasets
d1 <- cleanup("study 1", "adults")
d1b <- cleanup("study 1", "adults")
d1c <- cleanup("study 1", "adults")
d2 <- cleanup("study 2", "children")
d3 <- cleanup("study 3", "children")
d4 <- cleanup("study 4", "children")
d5 <- cleanup("study 5", "children")
# tweak by hand
d2 <- d2 %>%
  filter(!is.na(age)) %>%
  filter(age >= 7, age < 10) %>%
  filter(character != "elephant")
d3_outsideage <- d3 %>% filter(age < 7 | age >= 10) %>% distinct(subid)
d3 <- d3 %>%
  filter(!is.na(character), character != "") %>%
  filter(!subid %in% d3_outsideage$subid) %>%
  # filter(age >= 7, age < 10) %>%
  mutate(ethnicity = gsub(" SN", "", ethnicity)) %>%
  mutate(race_cat = ifelse(grepl("bing", tolower(testingSite)),
                           ifelse(ethnicity == "A", "east_asian",
                                  ifelse(ethnicity == "C" | ethnicity == "Cj", "white",
                                         ifelse(ethnicity == "I", "south_asian",
                                                ifelse(ethnicity == "ME", "middle_eastern",
                                                       ifelse(ethnicity == "Af", "black",
                                                              ifelse(ethnicity == "H", "hispanic",
                                                                     ifelse(grepl(" ", ethnicity) |
                                                                              grepl("/", ethnicity), "multiracial",
                                                                            NA))))))),
                           ifelse(tolower(ethnicity) == "black or african american", "black",
                                  ifelse(tolower(ethnicity) == "hispanic or latino/a", "hispanic",
                                         ifelse(tolower(ethnicity) == "east asian", "east_asian",
                                                ifelse(tolower(ethnicity) == "native american, american indian, or alaska native", "native_american",
                                                       ifelse(tolower(ethnicity) == "white" |
                                                                tolower(ethnicity) == "white, caucasian, or european american", "white",
                                                              ifelse(tolower(ethnicity) == "south or southeast asian" | tolower(ethnicity) == "south asian", "south_asian",
                                                                     ifelse(tolower(ethnicity) == "" | is.na(ethnicity), NA, "multiracial")))))))))
d4 <- d4 %>%
  filter(!is.na(character), character != "") %>%
  filter(age >= 4, age < 7) %>%
  mutate(ethnicity = gsub(" SN", "", ethnicity)) %>%
  mutate(race_cat = ifelse(grepl("bing", tolower(testingSite)),
                           ifelse(ethnicity == "A", "east_asian",
                                  ifelse(ethnicity == "C" | ethnicity == "Cj", "white",
                                         ifelse(ethnicity == "I", "south_asian",
                                                ifelse(ethnicity == "ME", "middle_eastern",
                                                       ifelse(ethnicity == "Af", "black",
                                                              ifelse(ethnicity == "H", "hispanic",
                                                                     ifelse(grepl(" ", ethnicity) |
                                                                              grepl("/", ethnicity), "multiracial",
                                                                            NA))))))),
                           ifelse(tolower(ethnicity) == "black or african american", "black",
                                  ifelse(tolower(ethnicity) == "hispanic or latino/a", "hispanic",
                                         ifelse(tolower(ethnicity) == "east asian", "east_asian",
                                                ifelse(tolower(ethnicity) == "native american, american indian, or alaska native", "native_american",
                                                       ifelse(tolower(ethnicity) == "white" |
                                                                tolower(ethnicity) == "white, caucasian, or european american", "white",
                                                              ifelse(tolower(ethnicity) == "south or southeast asian" | tolower(ethnicity) == "south asian", "south_asian",
                                                                     ifelse(tolower(ethnicity) == "" | is.na(ethnicity), NA, "multiracial")))))))))
d5 <- d5 %>%
  filter(!is.na(character), character != "") %>%
  filter(age >= 5.5, age < 7.5) %>%
  mutate(ethnicity = gsub(" SN", "", ethnicity)) %>%
  mutate(race_cat = ifelse(grepl("bing", tolower(testingSite)),
                           ifelse(ethnicity == "A", "east_asian",
                                  ifelse(ethnicity == "C" | ethnicity == "Cj", "white",
                                         ifelse(ethnicity == "I", "south_asian",
                                                ifelse(ethnicity == "ME", "middle_eastern",
                                                       ifelse(ethnicity == "Af", "black",
                                                              ifelse(ethnicity == "H", "hispanic",
                                                                     ifelse(grepl(" ", ethnicity) |
                                                                              grepl("/", ethnicity), "multiracial",
                                                                            NA))))))),
                           ifelse(tolower(ethnicity) == "black or african american", "black",
                                  ifelse(tolower(ethnicity) == "hispanic or latino/a", "hispanic",
                                         ifelse(tolower(ethnicity) == "east asian", "east_asian",
                                                ifelse(tolower(ethnicity) == "native american, american indian, or alaska native", "native_american",
                                                       ifelse(tolower(ethnicity) == "white" |
                                                                tolower(ethnicity) == "white, caucasian, or european american", "white",
                                                              ifelse(tolower(ethnicity) == "south or southeast asian" | tolower(ethnicity) == "south asian", "south_asian",
                                                                     ifelse(tolower(ethnicity) == "" | is.na(ethnicity), NA, "multiracial")))))))))
# make dataframes for s1
# d1_beetle <- makeDRDF("study 1", "beetle")
# d1_robot <- makeDRDF("study 1", "robot")
d1_all <- makeDRDF("study 1", "all")
# make dataframes for follow-up studies to s1
d1b_all <- makeDRDF("study 1b", "all")
d1c_all <- makeDRDF("study 1c", "all")
# make dataframes for study 2
# d2_beetle <- makeDRDF("study 2", "beetle")
# d2_robot <- makeDRDF("study 2", "robot")
d2_all <- makeDRDF("study 2", "all")
# make dataframes for study 3
# d3_beetle <- makeDRDF("study 3", "beetle")
# d3_robot <- makeDRDF("study 3", "robot")
d3_all <- makeDRDF("study 3", "all")
# make dataframes for study 4
d4_all <- makeDRDF("study 4", "all")

back to TOC

Analysis plan

For all studies we conduct exploratory factor analyses using Pearson correlations to find minimum residual solutions.

For each study, we first examine maximal unrotated and rotated solutions. To determine the maximum number of factors to extract, we use the following rule of thumb: With \(p\) observations per participant, we can extract a maximum of \(k\) factors, where \((p-k)*2 > p+k\), i.e., \(k < p/3\). Thus, with 40 mental capacity items, we can extract a maximum of 13 factors.

To determine how many factors to retain, we use the following preset retention criteria, considering the unrotated maximal solution (unless otherwise noted):

We then examine and interpret varimax-rotated solutions, extracting only the number of factors that meet these criteria.

Study 1 (CogSci 2017)

Study information:

Demographics

# make demographics tables
demoSampleSize("study 1")
demoDuration("study 1")
demoAge("study 1")
Joining, by = c("character", "min_age", "max_age", "median_age", "mean_age", "sd_age")
Column `character` joining factor and character vector, coercing into character vector
demoGender("study 1")
demoRace("study 1")

back to TOC

Exploratory factor analysis

Step 1: Run maximal EFA (without and with rotation)

# # alternative methods of determining how many factors
# fa.parallel(d1_all)
# VSS(d1_all)
# run EFA without rotation with N factors
efa_d1_all_unrotated <- fa(d1_all, 13, rotate = "none",
                           cor = chosenCorType, fm = "minres")
print(efa_d1_all_unrotated)
Factor Analysis using method =  minres
Call: fa(r = d1_all, nfactors = 13, rotate = "none", fm = "minres", 
    cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
                 MR1   MR2   MR3   MR4   MR5   MR6   MR7   MR8   MR9  MR10
angry           0.65 -0.04 -0.11 -0.03  0.05  0.22 -0.02  0.04 -0.10  0.17
beliefs         0.48  0.40 -0.16 -0.14  0.04 -0.38  0.18  0.09  0.07  0.04
calm            0.68 -0.17  0.01 -0.08 -0.08  0.04  0.08  0.10 -0.04  0.02
choices         0.37  0.34  0.36 -0.20  0.06  0.09 -0.25 -0.20  0.12 -0.05
communicating   0.11  0.62  0.18  0.14 -0.18  0.30  0.11  0.18  0.15 -0.05
computations   -0.33  0.82 -0.07  0.14 -0.03  0.00 -0.02  0.04  0.03  0.00
conscious       0.44  0.10  0.44 -0.11  0.17 -0.11 -0.24  0.06  0.08 -0.19
depressed       0.74  0.04 -0.37  0.04 -0.14  0.04 -0.17 -0.04 -0.21 -0.05
depth           0.26  0.27  0.48  0.28  0.12 -0.09 -0.16 -0.09  0.04 -0.08
desires         0.66 -0.17  0.10 -0.02 -0.03 -0.02  0.35 -0.48  0.13 -0.14
disrespected    0.63  0.06 -0.35  0.16  0.07  0.07 -0.13 -0.03 -0.07 -0.03
embarrassed     0.52  0.14 -0.40  0.19  0.48  0.18  0.11  0.11  0.12 -0.03
emo_recog       0.37  0.39 -0.10 -0.10  0.01 -0.27 -0.09  0.10  0.04  0.08
fear            0.72 -0.39  0.14  0.03 -0.18  0.07  0.09  0.12 -0.03  0.13
free_will       0.31  0.30  0.32 -0.40  0.15  0.22 -0.07 -0.19 -0.05  0.27
goal            0.41  0.21  0.19 -0.11  0.07 -0.11  0.18 -0.08  0.02 -0.03
guilt           0.62  0.14 -0.41  0.21  0.43  0.14  0.04  0.02  0.08  0.00
happy           0.76  0.00 -0.33 -0.08 -0.22  0.08 -0.15 -0.03 -0.08 -0.04
hungry          0.55 -0.71  0.22 -0.03  0.08 -0.02  0.06  0.02  0.03  0.03
intentions      0.19  0.62  0.02 -0.16  0.01  0.07  0.26  0.00 -0.20  0.00
joy             0.76  0.01 -0.39  0.10 -0.17 -0.01 -0.08 -0.07  0.05  0.00
love            0.75  0.11 -0.28  0.09 -0.07 -0.09 -0.07 -0.14 -0.03 -0.08
morality        0.31  0.50 -0.13  0.02 -0.07 -0.19  0.08  0.05 -0.04  0.00
nauseated       0.65 -0.32  0.14  0.08 -0.16  0.05  0.01 -0.06  0.14  0.03
odors           0.49 -0.35  0.37  0.05  0.15 -0.09 -0.03  0.10  0.07  0.01
pain            0.63 -0.52  0.19 -0.01 -0.04  0.11  0.11  0.19  0.05 -0.01
personality     0.44  0.36 -0.19 -0.13 -0.03 -0.27  0.01  0.00  0.24  0.20
pleasure        0.69 -0.23 -0.07  0.15 -0.15 -0.08 -0.15  0.06  0.16 -0.06
pride           0.68  0.18 -0.42  0.08  0.04  0.04  0.01 -0.08 -0.14  0.05
reasoning       0.34  0.44  0.31 -0.16  0.01  0.21 -0.11  0.01  0.08  0.20
recognizing     0.10  0.76  0.12  0.13 -0.21  0.15  0.11  0.11  0.15 -0.02
remembering     0.14  0.66  0.16  0.10 -0.15  0.13  0.01 -0.05  0.03 -0.15
safe            0.71 -0.29  0.21 -0.12 -0.03 -0.06  0.04  0.06 -0.03  0.09
seeing          0.33  0.15  0.50  0.28  0.08 -0.03 -0.07 -0.01 -0.11 -0.01
self_aware      0.46  0.18  0.22 -0.30  0.09  0.00  0.12  0.13 -0.20 -0.28
self_restraint  0.43  0.35 -0.05 -0.15  0.04 -0.19 -0.08  0.07  0.00  0.02
sounds          0.27  0.20  0.42  0.38 -0.06 -0.02  0.06 -0.07 -0.11  0.12
temperature     0.30  0.19  0.46  0.40  0.05 -0.22  0.04  0.00 -0.26  0.12
thoughts        0.55  0.18  0.10 -0.37 -0.01  0.04 -0.04  0.10 -0.09 -0.15
tired           0.69 -0.34  0.23  0.07 -0.06  0.05  0.06  0.08  0.07 -0.07
                MR11  MR12  MR13   h2   u2 com
angry           0.02 -0.20 -0.09 0.58 0.42 1.8
beliefs        -0.06 -0.09 -0.04 0.64 0.36 4.0
calm           -0.01  0.05 -0.07 0.54 0.46 1.3
choices         0.17 -0.07 -0.05 0.59 0.41 6.1
communicating  -0.08 -0.01 -0.03 0.65 0.35 2.6
computations    0.03 -0.06 -0.03 0.81 0.19 1.4
conscious      -0.15 -0.21  0.05 0.63 0.37 4.6
depressed      -0.02  0.06 -0.03 0.79 0.21 2.0
depth          -0.10 -0.13 -0.02 0.53 0.47 4.1
desires        -0.08  0.02 -0.07 0.87 0.13 2.9
disrespected   -0.07 -0.02  0.02 0.59 0.41 2.0
embarrassed     0.09  0.12  0.07 0.82 0.18 4.3
emo_recog      -0.14  0.14  0.11 0.46 0.54 4.3
fear           -0.04 -0.16  0.15 0.82 0.18 2.3
free_will       0.10  0.08  0.00 0.65 0.35 6.8
goal            0.07 -0.14  0.15 0.36 0.64 4.0
guilt          -0.03 -0.03 -0.05 0.84 0.16 3.3
happy          -0.08 -0.04 -0.08 0.80 0.20 1.8
hungry          0.05  0.07  0.01 0.88 0.12 2.2
intentions      0.09 -0.01  0.18 0.60 0.40 2.3
joy            -0.03  0.09 -0.01 0.79 0.21 1.8
love            0.00  0.08  0.07 0.71 0.29 1.6
morality        0.18 -0.10  0.10 0.46 0.54 2.9
nauseated       0.03  0.04  0.05 0.61 0.39 2.0
odors          -0.03  0.11  0.05 0.56 0.44 3.4
pain            0.09 -0.01 -0.14 0.80 0.20 2.7
personality    -0.06  0.09 -0.17 0.59 0.41 5.2
pleasure        0.21  0.09  0.18 0.72 0.28 2.3
pride          -0.06 -0.16  0.01 0.74 0.26 2.2
reasoning      -0.21  0.09  0.12 0.60 0.40 5.4
recognizing     0.00 -0.02 -0.12 0.75 0.25 1.7
remembering     0.04  0.09  0.10 0.58 0.42 1.7
safe           -0.13 -0.04  0.07 0.68 0.32 1.8
seeing          0.07  0.09 -0.08 0.50 0.50 3.1
self_aware     -0.21  0.15 -0.07 0.60 0.40 5.6
self_restraint  0.17 -0.04 -0.14 0.43 0.57 3.5
sounds         -0.07  0.08  0.01 0.48 0.52 4.0
temperature     0.09  0.06 -0.09 0.65 0.35 4.8
thoughts        0.19  0.09 -0.05 0.57 0.43 2.9
tired           0.09 -0.11 -0.05 0.70 0.30 2.0

                        MR1  MR2  MR3  MR4  MR5  MR6  MR7  MR8  MR9 MR10 MR11
SS loadings           11.03 5.51 3.15 1.29 0.87 0.84 0.64 0.56 0.51 0.46 0.43
Proportion Var         0.28 0.14 0.08 0.03 0.02 0.02 0.02 0.01 0.01 0.01 0.01
Cumulative Var         0.28 0.41 0.49 0.52 0.55 0.57 0.58 0.60 0.61 0.62 0.63
Proportion Explained   0.42 0.21 0.12 0.05 0.03 0.03 0.02 0.02 0.02 0.02 0.02
Cumulative Proportion  0.42 0.64 0.76 0.81 0.84 0.87 0.90 0.92 0.94 0.96 0.97
                      MR12 MR13
SS loadings           0.38 0.32
Proportion Var        0.01 0.01
Cumulative Var        0.64 0.65
Proportion Explained  0.01 0.01
Cumulative Proportion 0.99 1.00

Mean item complexity =  3.1
Test of the hypothesis that 13 factors are sufficient.

The degrees of freedom for the null model are  780  and the objective function was  27.45 with Chi Square of  5073.12
The degrees of freedom for the model are 338  and the objective function was  2.41 

The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.03 

The harmonic number of observations is  196 with the empirical chi square  93.35  with prob <  1 
The total number of observations was  200  with Likelihood Chi Square =  424.01  with prob <  0.001 

Tucker Lewis Index of factoring reliability =  0.951
RMSEA index =  0.046  and the 90 % confidence intervals are  0.024 0.046
BIC =  -1366.82
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6
Correlation of scores with factors             0.99 0.98 0.95 0.88 0.89 0.84
Multiple R square of scores with factors       0.98 0.95 0.91 0.77 0.79 0.70
Minimum correlation of possible factor scores  0.95 0.90 0.82 0.55 0.59 0.40
                                                MR7  MR8  MR9 MR10 MR11 MR12
Correlation of scores with factors             0.83 0.85 0.78 0.75 0.73 0.74
Multiple R square of scores with factors       0.70 0.73 0.61 0.57 0.54 0.54
Minimum correlation of possible factor scores  0.39 0.45 0.23 0.14 0.08 0.08
                                               MR13
Correlation of scores with factors             0.71
Multiple R square of scores with factors       0.50
Minimum correlation of possible factor scores  0.00
# examine eigenvalues and variance explained
efa_d1_all_unrotated_eigenvalues <- print(efa_d1_all_unrotated)$Vaccounted %>%
  t() %>%
  data.frame()
Factor Analysis using method =  minres
Call: fa(r = d1_all, nfactors = 13, rotate = "none", fm = "minres", 
    cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
                 MR1   MR2   MR3   MR4   MR5   MR6   MR7   MR8   MR9  MR10
angry           0.65 -0.04 -0.11 -0.03  0.05  0.22 -0.02  0.04 -0.10  0.17
beliefs         0.48  0.40 -0.16 -0.14  0.04 -0.38  0.18  0.09  0.07  0.04
calm            0.68 -0.17  0.01 -0.08 -0.08  0.04  0.08  0.10 -0.04  0.02
choices         0.37  0.34  0.36 -0.20  0.06  0.09 -0.25 -0.20  0.12 -0.05
communicating   0.11  0.62  0.18  0.14 -0.18  0.30  0.11  0.18  0.15 -0.05
computations   -0.33  0.82 -0.07  0.14 -0.03  0.00 -0.02  0.04  0.03  0.00
conscious       0.44  0.10  0.44 -0.11  0.17 -0.11 -0.24  0.06  0.08 -0.19
depressed       0.74  0.04 -0.37  0.04 -0.14  0.04 -0.17 -0.04 -0.21 -0.05
depth           0.26  0.27  0.48  0.28  0.12 -0.09 -0.16 -0.09  0.04 -0.08
desires         0.66 -0.17  0.10 -0.02 -0.03 -0.02  0.35 -0.48  0.13 -0.14
disrespected    0.63  0.06 -0.35  0.16  0.07  0.07 -0.13 -0.03 -0.07 -0.03
embarrassed     0.52  0.14 -0.40  0.19  0.48  0.18  0.11  0.11  0.12 -0.03
emo_recog       0.37  0.39 -0.10 -0.10  0.01 -0.27 -0.09  0.10  0.04  0.08
fear            0.72 -0.39  0.14  0.03 -0.18  0.07  0.09  0.12 -0.03  0.13
free_will       0.31  0.30  0.32 -0.40  0.15  0.22 -0.07 -0.19 -0.05  0.27
goal            0.41  0.21  0.19 -0.11  0.07 -0.11  0.18 -0.08  0.02 -0.03
guilt           0.62  0.14 -0.41  0.21  0.43  0.14  0.04  0.02  0.08  0.00
happy           0.76  0.00 -0.33 -0.08 -0.22  0.08 -0.15 -0.03 -0.08 -0.04
hungry          0.55 -0.71  0.22 -0.03  0.08 -0.02  0.06  0.02  0.03  0.03
intentions      0.19  0.62  0.02 -0.16  0.01  0.07  0.26  0.00 -0.20  0.00
joy             0.76  0.01 -0.39  0.10 -0.17 -0.01 -0.08 -0.07  0.05  0.00
love            0.75  0.11 -0.28  0.09 -0.07 -0.09 -0.07 -0.14 -0.03 -0.08
morality        0.31  0.50 -0.13  0.02 -0.07 -0.19  0.08  0.05 -0.04  0.00
nauseated       0.65 -0.32  0.14  0.08 -0.16  0.05  0.01 -0.06  0.14  0.03
odors           0.49 -0.35  0.37  0.05  0.15 -0.09 -0.03  0.10  0.07  0.01
pain            0.63 -0.52  0.19 -0.01 -0.04  0.11  0.11  0.19  0.05 -0.01
personality     0.44  0.36 -0.19 -0.13 -0.03 -0.27  0.01  0.00  0.24  0.20
pleasure        0.69 -0.23 -0.07  0.15 -0.15 -0.08 -0.15  0.06  0.16 -0.06
pride           0.68  0.18 -0.42  0.08  0.04  0.04  0.01 -0.08 -0.14  0.05
reasoning       0.34  0.44  0.31 -0.16  0.01  0.21 -0.11  0.01  0.08  0.20
recognizing     0.10  0.76  0.12  0.13 -0.21  0.15  0.11  0.11  0.15 -0.02
remembering     0.14  0.66  0.16  0.10 -0.15  0.13  0.01 -0.05  0.03 -0.15
safe            0.71 -0.29  0.21 -0.12 -0.03 -0.06  0.04  0.06 -0.03  0.09
seeing          0.33  0.15  0.50  0.28  0.08 -0.03 -0.07 -0.01 -0.11 -0.01
self_aware      0.46  0.18  0.22 -0.30  0.09  0.00  0.12  0.13 -0.20 -0.28
self_restraint  0.43  0.35 -0.05 -0.15  0.04 -0.19 -0.08  0.07  0.00  0.02
sounds          0.27  0.20  0.42  0.38 -0.06 -0.02  0.06 -0.07 -0.11  0.12
temperature     0.30  0.19  0.46  0.40  0.05 -0.22  0.04  0.00 -0.26  0.12
thoughts        0.55  0.18  0.10 -0.37 -0.01  0.04 -0.04  0.10 -0.09 -0.15
tired           0.69 -0.34  0.23  0.07 -0.06  0.05  0.06  0.08  0.07 -0.07
                MR11  MR12  MR13   h2   u2 com
angry           0.02 -0.20 -0.09 0.58 0.42 1.8
beliefs        -0.06 -0.09 -0.04 0.64 0.36 4.0
calm           -0.01  0.05 -0.07 0.54 0.46 1.3
choices         0.17 -0.07 -0.05 0.59 0.41 6.1
communicating  -0.08 -0.01 -0.03 0.65 0.35 2.6
computations    0.03 -0.06 -0.03 0.81 0.19 1.4
conscious      -0.15 -0.21  0.05 0.63 0.37 4.6
depressed      -0.02  0.06 -0.03 0.79 0.21 2.0
depth          -0.10 -0.13 -0.02 0.53 0.47 4.1
desires        -0.08  0.02 -0.07 0.87 0.13 2.9
disrespected   -0.07 -0.02  0.02 0.59 0.41 2.0
embarrassed     0.09  0.12  0.07 0.82 0.18 4.3
emo_recog      -0.14  0.14  0.11 0.46 0.54 4.3
fear           -0.04 -0.16  0.15 0.82 0.18 2.3
free_will       0.10  0.08  0.00 0.65 0.35 6.8
goal            0.07 -0.14  0.15 0.36 0.64 4.0
guilt          -0.03 -0.03 -0.05 0.84 0.16 3.3
happy          -0.08 -0.04 -0.08 0.80 0.20 1.8
hungry          0.05  0.07  0.01 0.88 0.12 2.2
intentions      0.09 -0.01  0.18 0.60 0.40 2.3
joy            -0.03  0.09 -0.01 0.79 0.21 1.8
love            0.00  0.08  0.07 0.71 0.29 1.6
morality        0.18 -0.10  0.10 0.46 0.54 2.9
nauseated       0.03  0.04  0.05 0.61 0.39 2.0
odors          -0.03  0.11  0.05 0.56 0.44 3.4
pain            0.09 -0.01 -0.14 0.80 0.20 2.7
personality    -0.06  0.09 -0.17 0.59 0.41 5.2
pleasure        0.21  0.09  0.18 0.72 0.28 2.3
pride          -0.06 -0.16  0.01 0.74 0.26 2.2
reasoning      -0.21  0.09  0.12 0.60 0.40 5.4
recognizing     0.00 -0.02 -0.12 0.75 0.25 1.7
remembering     0.04  0.09  0.10 0.58 0.42 1.7
safe           -0.13 -0.04  0.07 0.68 0.32 1.8
seeing          0.07  0.09 -0.08 0.50 0.50 3.1
self_aware     -0.21  0.15 -0.07 0.60 0.40 5.6
self_restraint  0.17 -0.04 -0.14 0.43 0.57 3.5
sounds         -0.07  0.08  0.01 0.48 0.52 4.0
temperature     0.09  0.06 -0.09 0.65 0.35 4.8
thoughts        0.19  0.09 -0.05 0.57 0.43 2.9
tired           0.09 -0.11 -0.05 0.70 0.30 2.0

                        MR1  MR2  MR3  MR4  MR5  MR6  MR7  MR8  MR9 MR10 MR11
SS loadings           11.03 5.51 3.15 1.29 0.87 0.84 0.64 0.56 0.51 0.46 0.43
Proportion Var         0.28 0.14 0.08 0.03 0.02 0.02 0.02 0.01 0.01 0.01 0.01
Cumulative Var         0.28 0.41 0.49 0.52 0.55 0.57 0.58 0.60 0.61 0.62 0.63
Proportion Explained   0.42 0.21 0.12 0.05 0.03 0.03 0.02 0.02 0.02 0.02 0.02
Cumulative Proportion  0.42 0.64 0.76 0.81 0.84 0.87 0.90 0.92 0.94 0.96 0.97
                      MR12 MR13
SS loadings           0.38 0.32
Proportion Var        0.01 0.01
Cumulative Var        0.64 0.65
Proportion Explained  0.01 0.01
Cumulative Proportion 0.99 1.00

Mean item complexity =  3.1
Test of the hypothesis that 13 factors are sufficient.

The degrees of freedom for the null model are  780  and the objective function was  27.45 with Chi Square of  5073.12
The degrees of freedom for the model are 338  and the objective function was  2.41 

The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.03 

The harmonic number of observations is  196 with the empirical chi square  93.35  with prob <  1 
The total number of observations was  200  with Likelihood Chi Square =  424.01  with prob <  0.001 

Tucker Lewis Index of factoring reliability =  0.951
RMSEA index =  0.046  and the 90 % confidence intervals are  0.024 0.046
BIC =  -1366.82
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6
Correlation of scores with factors             0.99 0.98 0.95 0.88 0.89 0.84
Multiple R square of scores with factors       0.98 0.95 0.91 0.77 0.79 0.70
Minimum correlation of possible factor scores  0.95 0.90 0.82 0.55 0.59 0.40
                                                MR7  MR8  MR9 MR10 MR11 MR12
Correlation of scores with factors             0.83 0.85 0.78 0.75 0.73 0.74
Multiple R square of scores with factors       0.70 0.73 0.61 0.57 0.54 0.54
Minimum correlation of possible factor scores  0.39 0.45 0.23 0.14 0.08 0.08
                                               MR13
Correlation of scores with factors             0.71
Multiple R square of scores with factors       0.50
Minimum correlation of possible factor scores  0.00
# count factors with eigenvalues > 1 and variance explained > 5%
efa_d1_all_unrotated_nfactors <- efa_d1_all_unrotated_eigenvalues %>%
  filter(SS.loadings > 1, Proportion.Explained > 0.05) %>%
  count() %>%
  as.numeric()
efa_d1_all_unrotated_nfactors
[1] 3
efa_d1_all_rotated_max <- fa(d1_all, 13, rotate = chosenRotType,
                           cor = chosenCorType, fm = "minres")
efa_d1_all_rotated <- fa(d1_all, efa_d1_all_unrotated_nfactors, rotate = chosenRotType,
                           cor = chosenCorType, fm = "minres")
# check that each of these factors is the dominant factor for at least one mental capacity item
efa_d1_all_rotated_loadings <- fa.sort(loadings(efa_d1_all_rotated)[]) %>%
  data.frame() %>%
  rownames_to_column("capacity") %>%
  gather(factor, loading, -capacity) %>%
  mutate(loading_abs = abs(loading)) %>%
  group_by(capacity) %>%
  top_n(1, loading_abs) %>%
  ungroup()
efa_d1_all_rotated_loadings
# drop any factors where n < 1
efa_d1_all_rotated_loadings %>% 
  count(factor) %>% 
  filter(n > 0)
# set number of factors to extract
nfactors_d1_all <- efa_d1_all_rotated_loadings %>% 
  count(factor) %>% 
  filter(n > 0) %>%
  nrow()
nfactors_d1_all
[1] 3

Step 2: Run EFA with rotation

# run EFA with rotation with N factors
efa_d1_all_rotatedN <- fa(d1_all, nfactors_d1_all, 
                          rotate = chosenRotType, cor = chosenCorType, fm = "minres")
print(efa_d1_all_rotatedN)
Factor Analysis using method =  minres
Call: fa(r = d1_all, nfactors = nfactors_d1_all, rotate = chosenRotType, 
    fm = "minres", cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
                 MR1   MR2   MR3   h2   u2 com
angry           0.50  0.27  0.09 0.43 0.57 1.6
beliefs         0.53 -0.17  0.24 0.40 0.60 1.6
calm            0.39  0.45  0.12 0.50 0.50 2.1
choices         0.03  0.08  0.59 0.36 0.64 1.0
communicating   0.07 -0.33  0.53 0.41 0.59 1.7
computations    0.04 -0.83  0.33 0.80 0.20 1.3
conscious      -0.05  0.34  0.54 0.37 0.63 1.7
depressed       0.81  0.10 -0.06 0.68 0.32 1.0
depth          -0.17  0.15  0.62 0.35 0.65 1.3
desires         0.31  0.45  0.17 0.44 0.56 2.1
disrespected    0.72  0.05 -0.06 0.53 0.47 1.0
embarrassed     0.66 -0.06 -0.07 0.39 0.61 1.0
emo_recog       0.41 -0.18  0.26 0.29 0.71 2.1
fear            0.26  0.70  0.11 0.68 0.32 1.3
free_will       0.02  0.06  0.49 0.25 0.75 1.0
goal            0.15  0.12  0.41 0.25 0.75 1.4
guilt           0.75 -0.03 -0.05 0.53 0.47 1.0
happy           0.78  0.17 -0.04 0.68 0.32 1.1
hungry          0.00  0.93 -0.06 0.87 0.13 1.0
intentions      0.25 -0.38  0.43 0.41 0.59 2.6
joy             0.84  0.12 -0.09 0.73 0.27 1.1
love            0.76  0.10  0.06 0.66 0.34 1.0
morality        0.43 -0.32  0.28 0.36 0.64 2.6
nauseated       0.23  0.62  0.13 0.54 0.46 1.4
odors          -0.08  0.69  0.25 0.50 0.50 1.3
pain            0.13  0.79  0.05 0.70 0.30 1.1
personality     0.52 -0.18  0.19 0.34 0.66 1.5
pleasure        0.44  0.44  0.02 0.51 0.49 2.0
pride           0.85 -0.06 -0.04 0.68 0.32 1.0
reasoning       0.07 -0.02  0.60 0.39 0.61 1.0
recognizing     0.14 -0.48  0.57 0.59 0.41 2.1
remembering     0.11 -0.37  0.56 0.48 0.52 1.8
safe            0.22  0.65  0.22 0.63 0.37 1.5
seeing         -0.17  0.29  0.59 0.37 0.63 1.6
self_aware      0.15  0.18  0.40 0.27 0.73 1.7
self_restraint  0.40 -0.10  0.29 0.30 0.70 2.0
sounds         -0.13  0.18  0.53 0.27 0.73 1.3
temperature    -0.13  0.21  0.55 0.30 0.70 1.4
thoughts        0.31  0.16  0.34 0.33 0.67 2.4
tired           0.17  0.70  0.20 0.64 0.36 1.3

                       MR1  MR2  MR3
SS loadings           7.56 6.63 5.04
Proportion Var        0.19 0.17 0.13
Cumulative Var        0.19 0.35 0.48
Proportion Explained  0.39 0.34 0.26
Cumulative Proportion 0.39 0.74 1.00

 With factor correlations of 
     MR1   MR2   MR3
MR1 1.00  0.28  0.30
MR2 0.28  1.00 -0.01
MR3 0.30 -0.01  1.00

Mean item complexity =  1.5
Test of the hypothesis that 3 factors are sufficient.

The degrees of freedom for the null model are  780  and the objective function was  27.45 with Chi Square of  5073.12
The degrees of freedom for the model are 663  and the objective function was  6.67 

The root mean square of the residuals (RMSR) is  0.05 
The df corrected root mean square of the residuals is  0.05 

The harmonic number of observations is  196 with the empirical chi square  729.79  with prob <  0.036 
The total number of observations was  200  with Likelihood Chi Square =  1219.34  with prob <  2.1e-35 

Tucker Lewis Index of factoring reliability =  0.846
RMSEA index =  0.071  and the 90 % confidence intervals are  0.059 NA
BIC =  -2293.44
Fit based upon off diagonal values = 0.98
Measures of factor score adequacy             
                                                MR1  MR2  MR3
Correlation of scores with factors             0.97 0.98 0.95
Multiple R square of scores with factors       0.95 0.96 0.89
Minimum correlation of possible factor scores  0.89 0.92 0.79
# get loadings for each factor
efa_d1_all_rotatedN_loadings <- loadings(efa_d1_all_rotatedN)[] %>%
  data.frame() %>% 
  rownames_to_column(var = "capacity")

back to TOC

Factor loadings table

data.frame(loadings(fa.sort(efa_d1_all_rotatedN))[]) %>%
  rownames_to_column("capacity") %>%
  mutate_at(vars(starts_with("M")), funs(round2))

Study 2 (CogSci 2017)

Study information:

Demographics

# make demographics tables
demoSampleSize("study 2")
# demoDuration("study 2")
demoAge("study 2")
Joining, by = c("character", "min_age", "max_age", "median_age", "mean_age", "sd_age")
Column `character` joining factor and character vector, coercing into character vector
demoGender("study 2")
# demoRace("study 2")

back to TOC

Exploratory factor analysis

Step 1: Run maximal EFA (without and with rotation)

# # alternative methods of determining how many factors
# fa.parallel(d2_all)
# VSS(d2_all)
# run EFA without rotation with N factors
efa_d2_all_unrotated <- fa(d2_all, 13, rotate = "none",
                           cor = chosenCorType, fm = "minres")
print(efa_d2_all_unrotated)
Factor Analysis using method =  minres
Call: fa(r = d2_all, nfactors = 13, rotate = "none", fm = "minres", 
    cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
                 MR1   MR2   MR3   MR4   MR5   MR6   MR7   MR8   MR9  MR10
angry           0.57 -0.17 -0.04 -0.07  0.05  0.16  0.11  0.06 -0.04  0.01
beliefs         0.54  0.23 -0.07 -0.09  0.05  0.24 -0.12 -0.05 -0.01  0.13
calm            0.55 -0.07  0.01  0.02 -0.10 -0.09 -0.14  0.05 -0.01 -0.18
choices         0.43  0.05  0.26 -0.38 -0.07  0.20 -0.05 -0.13  0.11  0.05
communicating   0.09  0.30  0.16  0.30 -0.17  0.03  0.19  0.11  0.29  0.04
computations   -0.01  0.80 -0.04  0.02  0.08  0.10 -0.09  0.03  0.10 -0.11
conscious       0.36  0.08  0.48  0.21 -0.14  0.01  0.16 -0.12 -0.27 -0.14
depressed       0.69 -0.11 -0.13  0.05 -0.06 -0.13  0.12  0.06  0.21 -0.09
depth           0.14  0.22  0.36  0.12  0.34  0.02 -0.14 -0.07 -0.02  0.02
desires         0.52 -0.19 -0.03 -0.01 -0.08  0.21 -0.07 -0.04  0.02  0.10
disrespected    0.69  0.00 -0.11 -0.07 -0.03 -0.02  0.16 -0.16 -0.09  0.03
embarrassed     0.53  0.03 -0.30  0.10  0.22  0.34  0.23 -0.06 -0.01 -0.03
emo_recog       0.34  0.50 -0.05  0.09  0.11 -0.07  0.22  0.14 -0.09  0.07
fear            0.55 -0.37  0.11  0.11 -0.08  0.03  0.01  0.17  0.09  0.03
free_will       0.49  0.00  0.32 -0.22 -0.09  0.11 -0.21 -0.18  0.08  0.03
goal            0.35  0.31 -0.03 -0.09 -0.06  0.10 -0.11  0.22  0.02 -0.18
guilt           0.58  0.07 -0.18  0.13  0.25  0.19 -0.07 -0.10 -0.07 -0.08
happy           0.72  0.09 -0.20  0.18 -0.20 -0.06 -0.01 -0.13  0.09 -0.03
hungry          0.38 -0.77  0.22  0.02  0.14 -0.04  0.01 -0.08  0.06  0.05
intentions      0.35  0.40  0.15 -0.24  0.11  0.03  0.02 -0.12  0.09 -0.14
joy             0.70  0.00 -0.26  0.10 -0.18 -0.10 -0.03 -0.05  0.06 -0.01
love            0.60  0.03 -0.20  0.11  0.03 -0.11  0.09 -0.19 -0.05  0.05
morality        0.44  0.37 -0.13 -0.08  0.21 -0.26 -0.05  0.26 -0.18  0.33
nauseated       0.30 -0.43  0.06  0.11  0.27  0.05  0.00  0.07  0.16  0.06
odors           0.15 -0.53  0.38  0.06  0.09  0.12 -0.06  0.16  0.06  0.03
pain            0.45 -0.64  0.21 -0.06  0.07 -0.09 -0.05 -0.04 -0.01  0.10
personality     0.54  0.29 -0.01 -0.12  0.20  0.12  0.01  0.18 -0.01  0.06
pleasure        0.60  0.04 -0.18  0.10 -0.23 -0.17 -0.31  0.04  0.01 -0.04
pride           0.68  0.14 -0.31  0.06 -0.05 -0.02  0.01 -0.04 -0.01 -0.04
reasoning       0.23  0.28  0.36  0.05 -0.16 -0.01 -0.05  0.01  0.05  0.12
recognizing     0.20  0.32  0.13  0.10  0.11  0.00 -0.11  0.21  0.06  0.00
remembering     0.06  0.58  0.17  0.13 -0.05  0.00  0.01 -0.17  0.19  0.28
safe            0.58 -0.08  0.23  0.06 -0.06 -0.06 -0.19  0.16 -0.24  0.00
seeing         -0.07  0.13  0.26 -0.03 -0.19 -0.08  0.19 -0.08  0.02  0.27
self_aware      0.27  0.21  0.46 -0.03 -0.10  0.09  0.23  0.00 -0.31 -0.10
self_restraint  0.34  0.19  0.15 -0.56  0.11 -0.33  0.20  0.05  0.17 -0.16
sounds         -0.07  0.10  0.40  0.10 -0.18  0.23  0.08  0.23  0.14 -0.08
temperature    -0.05  0.34  0.41  0.31  0.34 -0.26 -0.15 -0.23  0.08 -0.15
thoughts        0.57  0.01  0.18 -0.05 -0.11 -0.16 -0.03  0.03 -0.09  0.03
tired           0.39 -0.35  0.07  0.11  0.16 -0.16  0.24  0.06  0.12 -0.07
                MR11  MR12  MR13   h2   u2 com
angry          -0.04  0.02 -0.16 0.44 0.56 1.7
beliefs         0.06  0.08  0.21 0.50 0.50 2.8
calm            0.10 -0.02  0.10 0.40 0.60 1.8
choices        -0.15  0.16 -0.09 0.54 0.46 4.6
communicating   0.04 -0.02 -0.12 0.40 0.60 5.9
computations    0.08  0.10  0.00 0.71 0.29 1.2
conscious      -0.04 -0.12  0.01 0.58 0.42 4.2
depressed      -0.15 -0.01  0.00 0.63 0.37 1.7
depth           0.17 -0.15 -0.07 0.41 0.59 4.8
desires         0.03 -0.17  0.15 0.42 0.58 2.3
disrespected    0.10  0.09  0.08 0.58 0.42 1.4
embarrassed     0.02 -0.13 -0.05 0.63 0.37 3.7
emo_recog      -0.02  0.13  0.05 0.49 0.51 3.1
fear           -0.06 -0.25 -0.09 0.58 0.42 2.9
free_will      -0.02 -0.03 -0.10 0.51 0.49 3.5
goal           -0.25 -0.04  0.14 0.42 0.58 5.4
guilt           0.14 -0.05 -0.03 0.53 0.47 2.4
happy           0.12  0.05 -0.09 0.69 0.31 1.8
hungry          0.00  0.03  0.01 0.81 0.19 1.8
intentions      0.08  0.05 -0.12 0.43 0.57 4.2
joy             0.05  0.11  0.02 0.62 0.38 1.6
love            0.07  0.03  0.14 0.50 0.50 1.9
morality        0.07  0.03 -0.09 0.69 0.31 5.9
nauseated      -0.10  0.02  0.08 0.42 0.58 3.6
odors           0.19  0.09 -0.06 0.55 0.45 3.0
pain           -0.01  0.06  0.08 0.70 0.30 2.3
personality    -0.09  0.00  0.09 0.50 0.50 2.6
pleasure        0.08 -0.09 -0.02 0.60 0.40 2.5
pride          -0.03  0.01 -0.15 0.61 0.39 1.7
reasoning      -0.06 -0.11  0.22 0.37 0.63 4.8
recognizing     0.04 -0.14  0.05 0.26 0.74 4.7
remembering    -0.24 -0.03 -0.08 0.59 0.41 2.8
safe           -0.10  0.09 -0.22 0.59 0.41 2.8
seeing          0.20 -0.08  0.02 0.30 0.70 6.0
self_aware     -0.09 -0.03  0.01 0.52 0.48 4.2
self_restraint  0.15 -0.19  0.01 0.76 0.24 4.5
sounds          0.25  0.23  0.06 0.47 0.53 5.6
temperature    -0.09  0.08  0.04 0.68 0.32 6.4
thoughts       -0.03  0.15  0.08 0.44 0.56 1.8
tired          -0.11  0.12  0.05 0.45 0.55 4.7

                       MR1  MR2  MR3  MR4  MR5  MR6  MR7  MR8  MR9 MR10 MR11
SS loadings           8.25 4.13 2.18 1.05 0.96 0.84 0.73 0.66 0.62 0.54 0.52
Proportion Var        0.21 0.10 0.05 0.03 0.02 0.02 0.02 0.02 0.02 0.01 0.01
Cumulative Var        0.21 0.31 0.36 0.39 0.41 0.44 0.45 0.47 0.49 0.50 0.51
Proportion Explained  0.39 0.19 0.10 0.05 0.05 0.04 0.03 0.03 0.03 0.03 0.02
Cumulative Proportion 0.39 0.58 0.68 0.73 0.78 0.82 0.85 0.88 0.91 0.94 0.96
                      MR12 MR13
SS loadings           0.44 0.40
Proportion Var        0.01 0.01
Cumulative Var        0.52 0.53
Proportion Explained  0.02 0.02
Cumulative Proportion 0.98 1.00

Mean item complexity =  3.4
Test of the hypothesis that 13 factors are sufficient.

The degrees of freedom for the null model are  780  and the objective function was  17.08 with Chi Square of  3157.08
The degrees of freedom for the model are 338  and the objective function was  1.79 

The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.03 

The harmonic number of observations is  198 with the empirical chi square  142.71  with prob <  1 
The total number of observations was  200  with Likelihood Chi Square =  314.7  with prob <  0.81 

Tucker Lewis Index of factoring reliability =  1.024
RMSEA index =  0.016  and the 90 % confidence intervals are  0 0.018
BIC =  -1476.13
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6
Correlation of scores with factors             0.98 0.96 0.91 0.86 0.83 0.83
Multiple R square of scores with factors       0.95 0.93 0.83 0.74 0.69 0.68
Minimum correlation of possible factor scores  0.90 0.86 0.67 0.48 0.38 0.36
                                                MR7  MR8  MR9 MR10 MR11 MR12
Correlation of scores with factors             0.79 0.77 0.77 0.75 0.73 0.71
Multiple R square of scores with factors       0.62 0.60 0.59 0.56 0.53 0.50
Minimum correlation of possible factor scores  0.23 0.19 0.18 0.12 0.06 0.00
                                                MR13
Correlation of scores with factors              0.67
Multiple R square of scores with factors        0.45
Minimum correlation of possible factor scores  -0.10
# examine eigenvalues and variance explained
efa_d2_all_unrotated_eigenvalues <- print(efa_d2_all_unrotated)$Vaccounted %>%
  t() %>%
  data.frame()
Factor Analysis using method =  minres
Call: fa(r = d2_all, nfactors = 13, rotate = "none", fm = "minres", 
    cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
                 MR1   MR2   MR3   MR4   MR5   MR6   MR7   MR8   MR9  MR10
angry           0.57 -0.17 -0.04 -0.07  0.05  0.16  0.11  0.06 -0.04  0.01
beliefs         0.54  0.23 -0.07 -0.09  0.05  0.24 -0.12 -0.05 -0.01  0.13
calm            0.55 -0.07  0.01  0.02 -0.10 -0.09 -0.14  0.05 -0.01 -0.18
choices         0.43  0.05  0.26 -0.38 -0.07  0.20 -0.05 -0.13  0.11  0.05
communicating   0.09  0.30  0.16  0.30 -0.17  0.03  0.19  0.11  0.29  0.04
computations   -0.01  0.80 -0.04  0.02  0.08  0.10 -0.09  0.03  0.10 -0.11
conscious       0.36  0.08  0.48  0.21 -0.14  0.01  0.16 -0.12 -0.27 -0.14
depressed       0.69 -0.11 -0.13  0.05 -0.06 -0.13  0.12  0.06  0.21 -0.09
depth           0.14  0.22  0.36  0.12  0.34  0.02 -0.14 -0.07 -0.02  0.02
desires         0.52 -0.19 -0.03 -0.01 -0.08  0.21 -0.07 -0.04  0.02  0.10
disrespected    0.69  0.00 -0.11 -0.07 -0.03 -0.02  0.16 -0.16 -0.09  0.03
embarrassed     0.53  0.03 -0.30  0.10  0.22  0.34  0.23 -0.06 -0.01 -0.03
emo_recog       0.34  0.50 -0.05  0.09  0.11 -0.07  0.22  0.14 -0.09  0.07
fear            0.55 -0.37  0.11  0.11 -0.08  0.03  0.01  0.17  0.09  0.03
free_will       0.49  0.00  0.32 -0.22 -0.09  0.11 -0.21 -0.18  0.08  0.03
goal            0.35  0.31 -0.03 -0.09 -0.06  0.10 -0.11  0.22  0.02 -0.18
guilt           0.58  0.07 -0.18  0.13  0.25  0.19 -0.07 -0.10 -0.07 -0.08
happy           0.72  0.09 -0.20  0.18 -0.20 -0.06 -0.01 -0.13  0.09 -0.03
hungry          0.38 -0.77  0.22  0.02  0.14 -0.04  0.01 -0.08  0.06  0.05
intentions      0.35  0.40  0.15 -0.24  0.11  0.03  0.02 -0.12  0.09 -0.14
joy             0.70  0.00 -0.26  0.10 -0.18 -0.10 -0.03 -0.05  0.06 -0.01
love            0.60  0.03 -0.20  0.11  0.03 -0.11  0.09 -0.19 -0.05  0.05
morality        0.44  0.37 -0.13 -0.08  0.21 -0.26 -0.05  0.26 -0.18  0.33
nauseated       0.30 -0.43  0.06  0.11  0.27  0.05  0.00  0.07  0.16  0.06
odors           0.15 -0.53  0.38  0.06  0.09  0.12 -0.06  0.16  0.06  0.03
pain            0.45 -0.64  0.21 -0.06  0.07 -0.09 -0.05 -0.04 -0.01  0.10
personality     0.54  0.29 -0.01 -0.12  0.20  0.12  0.01  0.18 -0.01  0.06
pleasure        0.60  0.04 -0.18  0.10 -0.23 -0.17 -0.31  0.04  0.01 -0.04
pride           0.68  0.14 -0.31  0.06 -0.05 -0.02  0.01 -0.04 -0.01 -0.04
reasoning       0.23  0.28  0.36  0.05 -0.16 -0.01 -0.05  0.01  0.05  0.12
recognizing     0.20  0.32  0.13  0.10  0.11  0.00 -0.11  0.21  0.06  0.00
remembering     0.06  0.58  0.17  0.13 -0.05  0.00  0.01 -0.17  0.19  0.28
safe            0.58 -0.08  0.23  0.06 -0.06 -0.06 -0.19  0.16 -0.24  0.00
seeing         -0.07  0.13  0.26 -0.03 -0.19 -0.08  0.19 -0.08  0.02  0.27
self_aware      0.27  0.21  0.46 -0.03 -0.10  0.09  0.23  0.00 -0.31 -0.10
self_restraint  0.34  0.19  0.15 -0.56  0.11 -0.33  0.20  0.05  0.17 -0.16
sounds         -0.07  0.10  0.40  0.10 -0.18  0.23  0.08  0.23  0.14 -0.08
temperature    -0.05  0.34  0.41  0.31  0.34 -0.26 -0.15 -0.23  0.08 -0.15
thoughts        0.57  0.01  0.18 -0.05 -0.11 -0.16 -0.03  0.03 -0.09  0.03
tired           0.39 -0.35  0.07  0.11  0.16 -0.16  0.24  0.06  0.12 -0.07
                MR11  MR12  MR13   h2   u2 com
angry          -0.04  0.02 -0.16 0.44 0.56 1.7
beliefs         0.06  0.08  0.21 0.50 0.50 2.8
calm            0.10 -0.02  0.10 0.40 0.60 1.8
choices        -0.15  0.16 -0.09 0.54 0.46 4.6
communicating   0.04 -0.02 -0.12 0.40 0.60 5.9
computations    0.08  0.10  0.00 0.71 0.29 1.2
conscious      -0.04 -0.12  0.01 0.58 0.42 4.2
depressed      -0.15 -0.01  0.00 0.63 0.37 1.7
depth           0.17 -0.15 -0.07 0.41 0.59 4.8
desires         0.03 -0.17  0.15 0.42 0.58 2.3
disrespected    0.10  0.09  0.08 0.58 0.42 1.4
embarrassed     0.02 -0.13 -0.05 0.63 0.37 3.7
emo_recog      -0.02  0.13  0.05 0.49 0.51 3.1
fear           -0.06 -0.25 -0.09 0.58 0.42 2.9
free_will      -0.02 -0.03 -0.10 0.51 0.49 3.5
goal           -0.25 -0.04  0.14 0.42 0.58 5.4
guilt           0.14 -0.05 -0.03 0.53 0.47 2.4
happy           0.12  0.05 -0.09 0.69 0.31 1.8
hungry          0.00  0.03  0.01 0.81 0.19 1.8
intentions      0.08  0.05 -0.12 0.43 0.57 4.2
joy             0.05  0.11  0.02 0.62 0.38 1.6
love            0.07  0.03  0.14 0.50 0.50 1.9
morality        0.07  0.03 -0.09 0.69 0.31 5.9
nauseated      -0.10  0.02  0.08 0.42 0.58 3.6
odors           0.19  0.09 -0.06 0.55 0.45 3.0
pain           -0.01  0.06  0.08 0.70 0.30 2.3
personality    -0.09  0.00  0.09 0.50 0.50 2.6
pleasure        0.08 -0.09 -0.02 0.60 0.40 2.5
pride          -0.03  0.01 -0.15 0.61 0.39 1.7
reasoning      -0.06 -0.11  0.22 0.37 0.63 4.8
recognizing     0.04 -0.14  0.05 0.26 0.74 4.7
remembering    -0.24 -0.03 -0.08 0.59 0.41 2.8
safe           -0.10  0.09 -0.22 0.59 0.41 2.8
seeing          0.20 -0.08  0.02 0.30 0.70 6.0
self_aware     -0.09 -0.03  0.01 0.52 0.48 4.2
self_restraint  0.15 -0.19  0.01 0.76 0.24 4.5
sounds          0.25  0.23  0.06 0.47 0.53 5.6
temperature    -0.09  0.08  0.04 0.68 0.32 6.4
thoughts       -0.03  0.15  0.08 0.44 0.56 1.8
tired          -0.11  0.12  0.05 0.45 0.55 4.7

                       MR1  MR2  MR3  MR4  MR5  MR6  MR7  MR8  MR9 MR10 MR11
SS loadings           8.25 4.13 2.18 1.05 0.96 0.84 0.73 0.66 0.62 0.54 0.52
Proportion Var        0.21 0.10 0.05 0.03 0.02 0.02 0.02 0.02 0.02 0.01 0.01
Cumulative Var        0.21 0.31 0.36 0.39 0.41 0.44 0.45 0.47 0.49 0.50 0.51
Proportion Explained  0.39 0.19 0.10 0.05 0.05 0.04 0.03 0.03 0.03 0.03 0.02
Cumulative Proportion 0.39 0.58 0.68 0.73 0.78 0.82 0.85 0.88 0.91 0.94 0.96
                      MR12 MR13
SS loadings           0.44 0.40
Proportion Var        0.01 0.01
Cumulative Var        0.52 0.53
Proportion Explained  0.02 0.02
Cumulative Proportion 0.98 1.00

Mean item complexity =  3.4
Test of the hypothesis that 13 factors are sufficient.

The degrees of freedom for the null model are  780  and the objective function was  17.08 with Chi Square of  3157.08
The degrees of freedom for the model are 338  and the objective function was  1.79 

The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.03 

The harmonic number of observations is  198 with the empirical chi square  142.71  with prob <  1 
The total number of observations was  200  with Likelihood Chi Square =  314.7  with prob <  0.81 

Tucker Lewis Index of factoring reliability =  1.024
RMSEA index =  0.016  and the 90 % confidence intervals are  0 0.018
BIC =  -1476.13
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6
Correlation of scores with factors             0.98 0.96 0.91 0.86 0.83 0.83
Multiple R square of scores with factors       0.95 0.93 0.83 0.74 0.69 0.68
Minimum correlation of possible factor scores  0.90 0.86 0.67 0.48 0.38 0.36
                                                MR7  MR8  MR9 MR10 MR11 MR12
Correlation of scores with factors             0.79 0.77 0.77 0.75 0.73 0.71
Multiple R square of scores with factors       0.62 0.60 0.59 0.56 0.53 0.50
Minimum correlation of possible factor scores  0.23 0.19 0.18 0.12 0.06 0.00
                                                MR13
Correlation of scores with factors              0.67
Multiple R square of scores with factors        0.45
Minimum correlation of possible factor scores  -0.10
# count factors with eigenvalues > 1 and variance explained > 5%
efa_d2_all_unrotated_nfactors <- efa_d2_all_unrotated_eigenvalues %>%
  filter(SS.loadings > 1, Proportion.Explained > 0.05) %>%
  count() %>%
  as.numeric()
efa_d2_all_unrotated_nfactors
[1] 3
efa_d2_all_rotated_max <- fa(d2_all, 13, rotate = chosenRotType,
                           cor = chosenCorType, fm = "minres")
convergence not obtained in GPFoblq. 1000 iterations used.
efa_d2_all_rotated <- fa(d2_all, efa_d2_all_unrotated_nfactors, rotate = chosenRotType,
                           cor = chosenCorType, fm = "minres")
# check that each of these factors is the dominant factor for at least one mental capacity item
efa_d2_all_rotated_loadings <- fa.sort(loadings(efa_d2_all_rotated)[]) %>%
  data.frame() %>%
  rownames_to_column("capacity") %>%
  gather(factor, loading, -capacity) %>%
  mutate(loading_abs = abs(loading)) %>%
  group_by(capacity) %>%
  top_n(1, loading_abs) %>%
  ungroup()
efa_d2_all_rotated_loadings
# drop any factors where n < 1
efa_d2_all_rotated_loadings %>% 
  count(factor) %>% 
  filter(n > 0)
# set number of factors to extract
nfactors_d2_all <- efa_d2_all_rotated_loadings %>% 
  count(factor) %>% 
  filter(n > 0) %>%
  nrow()
nfactors_d2_all
[1] 3

Step 2: Run EFA with rotation

# run EFA with rotation with N factors
efa_d2_all_rotatedN <- fa(d2_all, nfactors_d2_all, 
                          rotate = chosenRotType, cor = chosenCorType, fm = "minres")
print(efa_d2_all_rotatedN)
Factor Analysis using method =  minres
Call: fa(r = d2_all, nfactors = nfactors_d2_all, rotate = chosenRotType, 
    fm = "minres", cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
                 MR1   MR2   MR3    h2   u2 com
angry           0.48  0.26  0.05 0.356 0.64 1.6
beliefs         0.51 -0.12  0.16 0.336 0.66 1.3
calm            0.44  0.17  0.12 0.299 0.70 1.5
choices         0.19  0.13  0.36 0.231 0.77 1.8
communicating   0.01 -0.20  0.26 0.111 0.89 1.9
computations    0.12 -0.76  0.25 0.650 0.35 1.3
conscious       0.00  0.16  0.56 0.331 0.67 1.2
depressed       0.65  0.20  0.02 0.504 0.50 1.2
depth          -0.09 -0.04  0.45 0.182 0.82 1.1
desires         0.42  0.27  0.04 0.301 0.70 1.7
disrespected    0.65  0.11  0.08 0.488 0.51 1.1
embarrassed     0.62 -0.02 -0.12 0.346 0.65 1.1
emo_recog       0.38 -0.40  0.22 0.360 0.64 2.6
fear            0.33  0.49  0.12 0.441 0.56 1.9
free_will       0.19  0.21  0.43 0.331 0.67 1.9
goal            0.35 -0.21  0.17 0.212 0.79 2.2
guilt           0.60 -0.01  0.01 0.358 0.64 1.0
happy           0.74  0.00  0.02 0.555 0.44 1.0
hungry          0.06  0.87  0.04 0.786 0.21 1.0
intentions      0.24 -0.24  0.37 0.293 0.71 2.5
joy             0.76  0.05 -0.07 0.555 0.44 1.0
love            0.64  0.03 -0.03 0.403 0.60 1.0
morality        0.47 -0.26  0.13 0.306 0.69 1.8
nauseated       0.15  0.47 -0.02 0.270 0.73 1.2
odors          -0.20  0.64  0.22 0.425 0.57 1.4
pain            0.15  0.77  0.10 0.662 0.34 1.1
personality     0.49 -0.15  0.24 0.372 0.63 1.7
pleasure        0.61  0.03  0.00 0.375 0.63 1.0
pride           0.81 -0.11 -0.08 0.594 0.41 1.1
reasoning      -0.02 -0.08  0.51 0.265 0.73 1.0
recognizing     0.12 -0.20  0.29 0.154 0.85 2.1
remembering     0.02 -0.44  0.36 0.333 0.67 1.9
safe            0.31  0.27  0.34 0.380 0.62 2.9
seeing         -0.21 -0.04  0.27 0.083 0.92 1.9
self_aware     -0.05  0.02  0.57 0.303 0.70 1.0
self_restraint  0.21 -0.04  0.26 0.144 0.86 2.0
sounds         -0.28  0.03  0.37 0.144 0.86 1.9
temperature    -0.23 -0.17  0.43 0.212 0.79 1.9
thoughts        0.35  0.17  0.34 0.364 0.64 2.5
tired           0.23  0.42  0.04 0.266 0.73 1.6

                       MR1  MR2  MR3
SS loadings           6.84 4.15 3.09
Proportion Var        0.17 0.10 0.08
Cumulative Var        0.17 0.27 0.35
Proportion Explained  0.49 0.29 0.22
Cumulative Proportion 0.49 0.78 1.00

 With factor correlations of 
     MR1   MR2   MR3
MR1 1.00  0.16  0.34
MR2 0.16  1.00 -0.02
MR3 0.34 -0.02  1.00

Mean item complexity =  1.6
Test of the hypothesis that 3 factors are sufficient.

The degrees of freedom for the null model are  780  and the objective function was  17.08 with Chi Square of  3157.08
The degrees of freedom for the model are 663  and the objective function was  4.79 

The root mean square of the residuals (RMSR) is  0.05 
The df corrected root mean square of the residuals is  0.05 

The harmonic number of observations is  198 with the empirical chi square  788.89  with prob <  0.00052 
The total number of observations was  200  with Likelihood Chi Square =  874.92  with prob <  5.4e-08 

Tucker Lewis Index of factoring reliability =  0.894
RMSEA index =  0.047  and the 90 % confidence intervals are  0.032 0.047
BIC =  -2637.86
Fit based upon off diagonal values = 0.95
Measures of factor score adequacy             
                                                MR1  MR2  MR3
Correlation of scores with factors             0.96 0.96 0.90
Multiple R square of scores with factors       0.92 0.92 0.81
Minimum correlation of possible factor scores  0.85 0.84 0.62
# get loadings for each factor
efa_d2_all_rotatedN_loadings <- loadings(efa_d2_all_rotatedN)[] %>%
  data.frame() %>% 
  rownames_to_column(var = "capacity")

back to TOC

Factor loadings table

data.frame(loadings(fa.sort(efa_d2_all_rotatedN))[]) %>%
  rownames_to_column("capacity") %>%
  mutate_at(vars(starts_with("M")), funs(round2))

Study 3 (CogSci 2018)

Study information:

Demographics

# make demographics tables
demoSampleSize("study 3")
# demoDuration("study 3")
demoAge("study 3")
Joining, by = c("character", "min_age", "max_age", "median_age", "mean_age", "sd_age")
Column `character` joining factor and character vector, coercing into character vector
# demoGender("study 3")
# demoRace("study 3")

back to TOC

Exploratory factor analysis

Step 1: Run maximal EFA (without and with rotation)

# # alternative methods of determining how many factors
# fa.parallel(d3_all)
# VSS(d3_all)
# run EFA without rotation with N factors
efa_d3_all_unrotated <- fa(d3_all, 6, rotate = "none",
                           cor = chosenCorType, fm = "minres")
print(efa_d3_all_unrotated)
Factor Analysis using method =  minres
Call: fa(r = d3_all, nfactors = 6, rotate = "none", fm = "minres", 
    cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
              MR1   MR2   MR3   MR4   MR5   MR6   h2   u2 com
angry        0.80 -0.08  0.00 -0.04 -0.36 -0.05 0.78 0.22 1.4
choices      0.56  0.52  0.15 -0.03 -0.03 -0.06 0.61 0.39 2.2
conscious    0.48  0.35  0.09  0.02  0.04  0.04 0.37 0.63 2.0
depressed    0.71 -0.23  0.21 -0.20 -0.15  0.16 0.69 0.31 1.8
depth        0.33  0.45  0.06 -0.17  0.24  0.16 0.43 0.57 3.2
disrespected 0.62 -0.23  0.27 -0.03 -0.01  0.27 0.59 0.41 2.1
embarrassed  0.53 -0.17  0.43  0.06  0.10  0.09 0.52 0.48 2.3
fear         0.83 -0.15 -0.27  0.11  0.10 -0.05 0.80 0.20 1.4
guilt        0.54 -0.33  0.46  0.38 -0.03 -0.07 0.76 0.24 3.6
happy        0.69 -0.18 -0.02 -0.27 -0.05 -0.15 0.60 0.40 1.6
hungry       0.75 -0.01 -0.54  0.10 -0.02 -0.03 0.86 0.14 1.9
love         0.65 -0.25  0.06  0.14  0.27  0.02 0.58 0.42 1.8
nauseated    0.52  0.10 -0.25  0.09 -0.21  0.34 0.50 0.50 2.8
odors        0.64  0.02 -0.42  0.14 -0.04 -0.10 0.61 0.39 1.9
pain         0.75 -0.15 -0.28 -0.08  0.10 -0.04 0.67 0.33 1.4
pride        0.72 -0.26  0.27 -0.23  0.02 -0.28 0.79 0.21 2.2
reasoning    0.39  0.61  0.07  0.06  0.06 -0.09 0.54 0.46 1.9
remembering  0.33  0.58  0.27  0.22 -0.15 -0.11 0.60 0.40 2.7
temperature  0.39  0.52  0.07 -0.14 -0.02  0.02 0.45 0.55 2.1
tired        0.77  0.07 -0.10  0.01  0.18  0.06 0.65 0.35 1.2

                       MR1  MR2  MR3  MR4  MR5  MR6
SS loadings           7.66 2.04 1.39 0.49 0.43 0.40
Proportion Var        0.38 0.10 0.07 0.02 0.02 0.02
Cumulative Var        0.38 0.49 0.55 0.58 0.60 0.62
Proportion Explained  0.62 0.16 0.11 0.04 0.03 0.03
Cumulative Proportion 0.62 0.78 0.89 0.93 0.97 1.00

Mean item complexity =  2.1
Test of the hypothesis that 6 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  12.17 with Chi Square of  1393.17
The degrees of freedom for the model are 85  and the objective function was  0.93 

The root mean square of the residuals (RMSR) is  0.03 
The df corrected root mean square of the residuals is  0.04 

The harmonic number of observations is  123 with the empirical chi square  32.36  with prob <  1 
The total number of observations was  123  with Likelihood Chi Square =  103.04  with prob <  0.089 

Tucker Lewis Index of factoring reliability =  0.965
RMSEA index =  0.053  and the 90 % confidence intervals are  0 0.068
BIC =  -306
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6
Correlation of scores with factors             0.98 0.91 0.92 0.79 0.76 0.72
Multiple R square of scores with factors       0.96 0.83 0.85 0.62 0.57 0.52
Minimum correlation of possible factor scores  0.92 0.66 0.69 0.25 0.14 0.05
# examine eigenvalues and variance explained
efa_d3_all_unrotated_eigenvalues <- print(efa_d3_all_unrotated)$Vaccounted %>%
  t() %>%
  data.frame()
Factor Analysis using method =  minres
Call: fa(r = d3_all, nfactors = 6, rotate = "none", fm = "minres", 
    cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
              MR1   MR2   MR3   MR4   MR5   MR6   h2   u2 com
angry        0.80 -0.08  0.00 -0.04 -0.36 -0.05 0.78 0.22 1.4
choices      0.56  0.52  0.15 -0.03 -0.03 -0.06 0.61 0.39 2.2
conscious    0.48  0.35  0.09  0.02  0.04  0.04 0.37 0.63 2.0
depressed    0.71 -0.23  0.21 -0.20 -0.15  0.16 0.69 0.31 1.8
depth        0.33  0.45  0.06 -0.17  0.24  0.16 0.43 0.57 3.2
disrespected 0.62 -0.23  0.27 -0.03 -0.01  0.27 0.59 0.41 2.1
embarrassed  0.53 -0.17  0.43  0.06  0.10  0.09 0.52 0.48 2.3
fear         0.83 -0.15 -0.27  0.11  0.10 -0.05 0.80 0.20 1.4
guilt        0.54 -0.33  0.46  0.38 -0.03 -0.07 0.76 0.24 3.6
happy        0.69 -0.18 -0.02 -0.27 -0.05 -0.15 0.60 0.40 1.6
hungry       0.75 -0.01 -0.54  0.10 -0.02 -0.03 0.86 0.14 1.9
love         0.65 -0.25  0.06  0.14  0.27  0.02 0.58 0.42 1.8
nauseated    0.52  0.10 -0.25  0.09 -0.21  0.34 0.50 0.50 2.8
odors        0.64  0.02 -0.42  0.14 -0.04 -0.10 0.61 0.39 1.9
pain         0.75 -0.15 -0.28 -0.08  0.10 -0.04 0.67 0.33 1.4
pride        0.72 -0.26  0.27 -0.23  0.02 -0.28 0.79 0.21 2.2
reasoning    0.39  0.61  0.07  0.06  0.06 -0.09 0.54 0.46 1.9
remembering  0.33  0.58  0.27  0.22 -0.15 -0.11 0.60 0.40 2.7
temperature  0.39  0.52  0.07 -0.14 -0.02  0.02 0.45 0.55 2.1
tired        0.77  0.07 -0.10  0.01  0.18  0.06 0.65 0.35 1.2

                       MR1  MR2  MR3  MR4  MR5  MR6
SS loadings           7.66 2.04 1.39 0.49 0.43 0.40
Proportion Var        0.38 0.10 0.07 0.02 0.02 0.02
Cumulative Var        0.38 0.49 0.55 0.58 0.60 0.62
Proportion Explained  0.62 0.16 0.11 0.04 0.03 0.03
Cumulative Proportion 0.62 0.78 0.89 0.93 0.97 1.00

Mean item complexity =  2.1
Test of the hypothesis that 6 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  12.17 with Chi Square of  1393.17
The degrees of freedom for the model are 85  and the objective function was  0.93 

The root mean square of the residuals (RMSR) is  0.03 
The df corrected root mean square of the residuals is  0.04 

The harmonic number of observations is  123 with the empirical chi square  32.36  with prob <  1 
The total number of observations was  123  with Likelihood Chi Square =  103.04  with prob <  0.089 

Tucker Lewis Index of factoring reliability =  0.965
RMSEA index =  0.053  and the 90 % confidence intervals are  0 0.068
BIC =  -306
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6
Correlation of scores with factors             0.98 0.91 0.92 0.79 0.76 0.72
Multiple R square of scores with factors       0.96 0.83 0.85 0.62 0.57 0.52
Minimum correlation of possible factor scores  0.92 0.66 0.69 0.25 0.14 0.05
# count factors with eigenvalues > 1 and variance explained > 5%
efa_d3_all_unrotated_nfactors <- efa_d3_all_unrotated_eigenvalues %>%
  filter(SS.loadings > 1, Proportion.Explained > 0.05) %>%
  count() %>%
  as.numeric()
efa_d3_all_unrotated_nfactors
[1] 3
efa_d3_all_rotated_max <- fa(d3_all, 6, rotate = chosenRotType,
                           cor = chosenCorType, fm = "minres")
efa_d3_all_rotated <- fa(d3_all, efa_d3_all_unrotated_nfactors, rotate = chosenRotType,
                           cor = chosenCorType, fm = "minres")
# check that each of these factors is the dominant factor for at least one mental capacity item
efa_d3_all_rotated_loadings <- fa.sort(loadings(efa_d3_all_rotated)[]) %>%
  data.frame() %>%
  rownames_to_column("capacity") %>%
  gather(factor, loading, -capacity) %>%
  mutate(loading_abs = abs(loading)) %>%
  group_by(capacity) %>%
  top_n(1, loading_abs) %>%
  ungroup()
efa_d3_all_rotated_loadings
# drop any factors where n < 1
efa_d3_all_rotated_loadings %>% 
  count(factor) %>% 
  filter(n > 0)
# set number of factors to extract
nfactors_d3_all <- efa_d3_all_rotated_loadings %>% 
  count(factor) %>% 
  filter(n > 0) %>%
  nrow()
nfactors_d3_all
[1] 3

Step 2: Run EFA with rotation

# run EFA with rotation with N factors
efa_d3_all_rotatedN <- fa(d3_all, nfactors_d3_all, 
                          rotate = chosenRotType, cor = chosenCorType, 
                          fm = "minres", 
                          n.iter = 5000) # many iter for bootstrapped CIs
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
An ultra-Heywood case was detected.  Examine the results carefully A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
An ultra-Heywood case was detected.  Examine the results carefully A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.
print(efa_d3_all_rotatedN)
Factor Analysis with confidence intervals using method = fa(r = d3_all, nfactors = nfactors_d3_all, n.iter = 5000, rotate = chosenRotType, 
    fm = "minres", cor = chosenCorType)
Factor Analysis using method =  minres
Call: fa(r = d3_all, nfactors = nfactors_d3_all, n.iter = 5000, rotate = chosenRotType, 
    fm = "minres", cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
               MR1   MR3   MR2   h2   u2 com
angry         0.41  0.43  0.14 0.62 0.38 2.2
choices       0.05  0.09  0.73 0.62 0.38 1.0
conscious     0.09  0.10  0.52 0.37 0.63 1.1
depressed     0.17  0.66  0.03 0.60 0.40 1.1
depth         0.04 -0.04  0.54 0.29 0.71 1.0
disrespected  0.06  0.67  0.02 0.51 0.49 1.0
embarrassed  -0.17  0.76  0.10 0.52 0.48 1.1
fear          0.73  0.26 -0.01 0.78 0.22 1.3
guilt        -0.11  0.78 -0.04 0.52 0.48 1.0
happy         0.38  0.42  0.01 0.49 0.51 2.0
hungry        0.98 -0.11  0.02 0.87 0.13 1.0
love          0.30  0.51 -0.05 0.48 0.52 1.6
nauseated     0.48  0.00  0.16 0.31 0.69 1.2
odors         0.78 -0.08  0.06 0.58 0.42 1.0
pain          0.69  0.21 -0.03 0.66 0.34 1.2
pride         0.13  0.71  0.02 0.63 0.37 1.1
reasoning     0.04 -0.11  0.74 0.54 0.46 1.0
remembering  -0.17  0.05  0.71 0.46 0.54 1.1
temperature   0.05 -0.05  0.65 0.43 0.57 1.0
tired         0.49  0.25  0.25 0.61 0.39 2.1

                       MR1  MR3  MR2
SS loadings           4.10 3.90 2.88
Proportion Var        0.21 0.19 0.14
Cumulative Var        0.21 0.40 0.54
Proportion Explained  0.38 0.36 0.26
Cumulative Proportion 0.38 0.74 1.00

 With factor correlations of 
     MR1 MR3  MR2
MR1 1.00 0.5 0.36
MR3 0.50 1.0 0.30
MR2 0.36 0.3 1.00

Mean item complexity =  1.3
Test of the hypothesis that 3 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  12.17 with Chi Square of  1393.17
The degrees of freedom for the model are 133  and the objective function was  1.7 

The root mean square of the residuals (RMSR) is  0.04 
The df corrected root mean square of the residuals is  0.05 

The harmonic number of observations is  123 with the empirical chi square  82.37  with prob <  1 
The total number of observations was  123  with Likelihood Chi Square =  191.76  with prob <  0.00065 

Tucker Lewis Index of factoring reliability =  0.929
RMSEA index =  0.068  and the 90 % confidence intervals are  0.04 0.078
BIC =  -448.26
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                MR1  MR3  MR2
Correlation of scores with factors             0.97 0.94 0.92
Multiple R square of scores with factors       0.94 0.89 0.85
Minimum correlation of possible factor scores  0.89 0.78 0.69

 Coefficients and bootstrapped confidence intervals 
               low   MR1 upper   low   MR3 upper   low   MR2 upper
angry         0.24  0.41  0.62  0.25  0.43  0.61  0.01  0.14  0.29
choices      -0.07  0.05  0.22 -0.06  0.09  0.25  0.57  0.73  0.86
conscious    -0.09  0.09  0.30 -0.05  0.10  0.28  0.36  0.52  0.67
depressed     0.02  0.17  0.39  0.46  0.66  0.84 -0.10  0.03  0.17
depth        -0.17  0.04  0.27 -0.23 -0.04  0.17  0.34  0.54  0.71
disrespected -0.10  0.06  0.27  0.45  0.67  0.87 -0.10  0.02  0.15
embarrassed  -0.30 -0.17  0.02  0.58  0.76  0.88 -0.02  0.10  0.22
fear          0.60  0.73  0.90  0.14  0.26  0.42 -0.10 -0.01  0.10
guilt        -0.28 -0.11  0.10  0.61  0.78  0.90 -0.16 -0.04  0.09
happy         0.20  0.38  0.61  0.23  0.42  0.61 -0.15  0.01  0.18
hungry        0.88  0.98  1.03 -0.20 -0.11  0.07 -0.06  0.02  0.14
love          0.12  0.30  0.53  0.32  0.51  0.69 -0.20 -0.05  0.11
nauseated     0.29  0.48  0.67 -0.18  0.00  0.21 -0.01  0.16  0.34
odors         0.63  0.78  0.92 -0.21 -0.08  0.11 -0.06  0.06  0.20
pain          0.53  0.69  0.88  0.08  0.21  0.38 -0.16 -0.03  0.12
pride        -0.02  0.13  0.34  0.53  0.71  0.87 -0.10  0.02  0.15
reasoning    -0.11  0.04  0.22 -0.25 -0.11  0.04  0.59  0.74  0.87
remembering  -0.35 -0.17  0.02 -0.13  0.05  0.22  0.57  0.71  0.84
temperature  -0.12  0.05  0.25 -0.20 -0.05  0.10  0.48  0.65  0.81
tired         0.31  0.49  0.71  0.12  0.25  0.41  0.09  0.25  0.42

 Interfactor correlations and bootstrapped confidence intervals 
        lower estimate upper
MR1-MR3 0.280     0.50  0.60
MR1-MR2 0.141     0.36  0.53
MR3-MR2 0.088     0.30  0.45
# get loadings for each factor
efa_d3_all_rotatedN_loadings <- loadings(efa_d3_all_rotatedN)[] %>%
  data.frame() %>% 
  rownames_to_column(var = "capacity")

back to TOC

Factor loadings table

data.frame(loadings(fa.sort(efa_d3_all_rotatedN))[]) %>%
  rownames_to_column("capacity") %>%
  mutate_at(vars(starts_with("M")), funs(round2))

Subscales

Reliability (and intercorrelations - see alpha)

# Cronbach's alpha (subscales)
keys.list <- list(HEART = c("pride", "depressed", "disrespected", "guilt", 
                           "embarrassed", "happy", "love"),
                  BODY = c("hungry", "odors", "fear", "pain", "tired", "angry", "nauseated"),
                  MIND = c("reasoning", "choices", "remembering", "temperature", 
                           "conscious", "depth")) 
scores <- scoreItems(keys.list, d3_all, min = 0, max = 1)  # or just use the keys.lit
# summary(scores)
scores
Call: scoreItems(keys = keys.list, items = d3_all, min = 0, max = 1)

(Unstandardized) Alpha:
      HEART BODY MIND
alpha  0.88 0.91 0.82

Standard errors of unstandardized Alpha:
      HEART  BODY  MIND
ASE   0.036 0.032 0.048

Average item correlation:
          HEART BODY MIND
average.r   0.5 0.58 0.43

 Guttman 6* reliability: 
         HEART BODY MIND
Lambda.6  0.89 0.93 0.83

Signal/Noise based upon av.r : 
             HEART BODY MIND
Signal/Noise     7  9.6  4.5

Scale intercorrelations corrected for attenuation 
 raw correlations below the diagonal, alpha on the diagonal 
 corrected correlations above the diagonal:
      HEART BODY MIND
HEART  0.88 0.74 0.37
BODY   0.66 0.91 0.50
MIND   0.31 0.43 0.82

 In order to see the item by scale loadings and frequency counts of the data
 print with the short option = FALSE
# omega
omega(d3_all, plot = F)
Omega 
Call: omega(m = d3_all, plot = F)
Alpha:                 0.92 
G.6:                   0.94 
Omega Hierarchical:    0.64 
Omega H asymptotic:    0.68 
Omega Total            0.94 

Schmid Leiman Factor loadings greater than  0.2 
                g   F1*   F2*   F3*   h2   u2   p2
angry        0.66  0.26  0.33       0.62 0.38 0.70
choices      0.44              0.64 0.62 0.38 0.32
conscious    0.38              0.46 0.37 0.63 0.40
depressed    0.57        0.51       0.60 0.40 0.55
depth        0.26              0.47 0.29 0.71 0.23
disrespected 0.49        0.52       0.51 0.49 0.47
embarrassed  0.40        0.58       0.52 0.48 0.31
fear         0.73  0.46  0.20       0.78 0.22 0.68
guilt        0.40        0.60       0.52 0.48 0.30
happy        0.57  0.24  0.32       0.49 0.51 0.67
hungry       0.70  0.61             0.87 0.13 0.56
love         0.54        0.39       0.48 0.52 0.60
nauseated    0.45  0.30             0.31 0.69 0.65
odors        0.58  0.49             0.58 0.42 0.58
pain         0.66  0.44             0.66 0.34 0.67
pride        0.57        0.55       0.63 0.37 0.51
reasoning    0.31              0.66 0.54 0.46 0.18
remembering  0.23              0.63 0.46 0.54 0.11
temperature  0.31              0.58 0.43 0.57 0.22
tired        0.66  0.30        0.22 0.61 0.39 0.71

With eigenvalues of:
  g F1* F2* F3* 
5.3 1.4 2.0 2.1 

general/max  2.53   max/min =   1.5
mean percent general =  0.47    with sd =  0.2 and cv of  0.42 
Explained Common Variance of the general factor =  0.49 

The degrees of freedom are 133  and the fit is  1.7 
The number of observations was  123  with Chi Square =  191.76  with prob <  0.00065
The root mean square of the residuals is  0.04 
The df corrected root mean square of the residuals is  0.05
RMSEA index =  0.068  and the 10 % confidence intervals are  0.04 0.078
BIC =  -448.26

Compare this with the adequacy of just a general factor and no group factors
The degrees of freedom for just the general factor are 170  and the fit is  5.12 
The number of observations was  123  with Chi Square =  582.57  with prob <  1.3e-46
The root mean square of the residuals is  0.16 
The df corrected root mean square of the residuals is  0.17 

RMSEA index =  0.148  and the 10 % confidence intervals are  0.129 0.154
BIC =  -235.5 

Measures of factor score adequacy             
                                                 g   F1*  F2*  F3*
Correlation of scores with factors            0.83  0.70 0.81 0.86
Multiple R square of scores with factors      0.69  0.49 0.66 0.74
Minimum correlation of factor score estimates 0.38 -0.02 0.32 0.49

 Total, General and Subset omega for each subset
                                                 g  F1*  F2*  F3*
Omega total for total scores and subscales    0.94 0.89 0.88 0.82
Omega general for total scores and subscales  0.64 0.61 0.49 0.20
Omega group for total scores and subscales    0.22 0.29 0.40 0.63

Study 4 (CogSci 2018)

Study information:

Demographics

# make demographics tables
demoSampleSize("study 4")
# demoDuration("study 4")
demoAge("study 4")
Joining, by = c("character", "min_age", "max_age", "median_age", "mean_age", "sd_age")
Column `character` joining factor and character vector, coercing into character vector
# demoGender("study 4")
demoRace("study 4")

back to TOC

Exploratory factor analysis

Step 1: Run maximal EFA (without and with rotation)

# # alternative methods of determining how many factors
# fa.parallel(d4_all)
# VSS(d4_all)
# run EFA without rotation with N factors
efa_d4_all_unrotated <- fa(d4_all, 6, rotate = "none", 
                           cor = chosenCorType, fm = "minres")
print(efa_d4_all_unrotated)
Factor Analysis using method =  minres
Call: fa(r = d4_all, nfactors = 6, rotate = "none", fm = "minres", 
    cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
              MR1   MR2   MR3   MR4   MR5   MR6   h2     u2 com
angry        0.67 -0.02 -0.20 -0.41  0.13  0.02 0.68 0.3238 2.0
choices      0.53  0.08  0.10  0.14  0.21  0.18 0.40 0.6042 1.9
conscious    0.57  0.56 -0.53  0.05 -0.26  0.04 1.00 0.0015 3.4
depressed    0.61 -0.18 -0.20 -0.06  0.29  0.22 0.58 0.4184 2.2
depth        0.43  0.31  0.07 -0.01  0.09  0.08 0.30 0.6981 2.1
disrespected 0.66 -0.06 -0.24 -0.20  0.15 -0.16 0.58 0.4173 1.8
embarrassed  0.55 -0.04  0.07  0.13 -0.05 -0.36 0.46 0.5369 1.9
fear         0.60 -0.13  0.16  0.10 -0.21  0.09 0.47 0.5347 1.6
guilt        0.50  0.17  0.22  0.02  0.15 -0.03 0.35 0.6478 1.9
happy        0.68 -0.19 -0.13  0.40  0.06 -0.07 0.69 0.3080 1.9
hungry       0.74 -0.20  0.22 -0.19 -0.10 -0.04 0.69 0.3127 1.5
love         0.59 -0.27 -0.12  0.36 -0.05  0.15 0.59 0.4133 2.4
nauseated    0.65 -0.19  0.04 -0.03  0.11 -0.24 0.53 0.4679 1.5
odors        0.62 -0.18  0.17 -0.20 -0.31  0.16 0.61 0.3906 2.3
pain         0.53  0.01 -0.11 -0.10 -0.13 -0.21 0.37 0.6327 1.6
pride        0.66 -0.14 -0.12  0.15 -0.09  0.06 0.50 0.4993 1.3
reasoning    0.51  0.23  0.15 -0.15 -0.03  0.03 0.36 0.6428 1.8
remembering  0.41  0.24  0.38  0.06 -0.04  0.02 0.37 0.6262 2.7
temperature  0.50  0.43  0.19  0.20  0.13 -0.09 0.53 0.4659 2.8
tired        0.72  0.03  0.10 -0.11  0.00  0.12 0.56 0.4423 1.2

                       MR1  MR2  MR3  MR4  MR5  MR6
SS loadings           7.04 1.04 0.86 0.74 0.49 0.44
Proportion Var        0.35 0.05 0.04 0.04 0.02 0.02
Cumulative Var        0.35 0.40 0.45 0.48 0.51 0.53
Proportion Explained  0.66 0.10 0.08 0.07 0.05 0.04
Cumulative Proportion 0.66 0.76 0.84 0.91 0.96 1.00

Mean item complexity =  2
Test of the hypothesis that 6 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  8.76 with Chi Square of  994.76
The degrees of freedom for the model are 85  and the objective function was  0.89 

The root mean square of the residuals (RMSR) is  0.03 
The df corrected root mean square of the residuals is  0.05 

The harmonic number of observations is  120 with the empirical chi square  50.27  with prob <  1 
The total number of observations was  122  with Likelihood Chi Square =  97.45  with prob <  0.17 

Tucker Lewis Index of factoring reliability =  0.964
RMSEA index =  0.047  and the 90 % confidence intervals are  0 0.063
BIC =  -310.9
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5   MR6
Correlation of scores with factors             0.97 0.90 0.88 0.82 0.77  0.69
Multiple R square of scores with factors       0.95 0.81 0.78 0.67 0.59  0.48
Minimum correlation of possible factor scores  0.89 0.63 0.56 0.34 0.19 -0.05
# examine eigenvalues and variance explained
efa_d4_all_unrotated_eigenvalues <- print(efa_d4_all_unrotated)$Vaccounted %>%
  t() %>%
  data.frame()
Factor Analysis using method =  minres
Call: fa(r = d4_all, nfactors = 6, rotate = "none", fm = "minres", 
    cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
              MR1   MR2   MR3   MR4   MR5   MR6   h2     u2 com
angry        0.67 -0.02 -0.20 -0.41  0.13  0.02 0.68 0.3238 2.0
choices      0.53  0.08  0.10  0.14  0.21  0.18 0.40 0.6042 1.9
conscious    0.57  0.56 -0.53  0.05 -0.26  0.04 1.00 0.0015 3.4
depressed    0.61 -0.18 -0.20 -0.06  0.29  0.22 0.58 0.4184 2.2
depth        0.43  0.31  0.07 -0.01  0.09  0.08 0.30 0.6981 2.1
disrespected 0.66 -0.06 -0.24 -0.20  0.15 -0.16 0.58 0.4173 1.8
embarrassed  0.55 -0.04  0.07  0.13 -0.05 -0.36 0.46 0.5369 1.9
fear         0.60 -0.13  0.16  0.10 -0.21  0.09 0.47 0.5347 1.6
guilt        0.50  0.17  0.22  0.02  0.15 -0.03 0.35 0.6478 1.9
happy        0.68 -0.19 -0.13  0.40  0.06 -0.07 0.69 0.3080 1.9
hungry       0.74 -0.20  0.22 -0.19 -0.10 -0.04 0.69 0.3127 1.5
love         0.59 -0.27 -0.12  0.36 -0.05  0.15 0.59 0.4133 2.4
nauseated    0.65 -0.19  0.04 -0.03  0.11 -0.24 0.53 0.4679 1.5
odors        0.62 -0.18  0.17 -0.20 -0.31  0.16 0.61 0.3906 2.3
pain         0.53  0.01 -0.11 -0.10 -0.13 -0.21 0.37 0.6327 1.6
pride        0.66 -0.14 -0.12  0.15 -0.09  0.06 0.50 0.4993 1.3
reasoning    0.51  0.23  0.15 -0.15 -0.03  0.03 0.36 0.6428 1.8
remembering  0.41  0.24  0.38  0.06 -0.04  0.02 0.37 0.6262 2.7
temperature  0.50  0.43  0.19  0.20  0.13 -0.09 0.53 0.4659 2.8
tired        0.72  0.03  0.10 -0.11  0.00  0.12 0.56 0.4423 1.2

                       MR1  MR2  MR3  MR4  MR5  MR6
SS loadings           7.04 1.04 0.86 0.74 0.49 0.44
Proportion Var        0.35 0.05 0.04 0.04 0.02 0.02
Cumulative Var        0.35 0.40 0.45 0.48 0.51 0.53
Proportion Explained  0.66 0.10 0.08 0.07 0.05 0.04
Cumulative Proportion 0.66 0.76 0.84 0.91 0.96 1.00

Mean item complexity =  2
Test of the hypothesis that 6 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  8.76 with Chi Square of  994.76
The degrees of freedom for the model are 85  and the objective function was  0.89 

The root mean square of the residuals (RMSR) is  0.03 
The df corrected root mean square of the residuals is  0.05 

The harmonic number of observations is  120 with the empirical chi square  50.27  with prob <  1 
The total number of observations was  122  with Likelihood Chi Square =  97.45  with prob <  0.17 

Tucker Lewis Index of factoring reliability =  0.964
RMSEA index =  0.047  and the 90 % confidence intervals are  0 0.063
BIC =  -310.9
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5   MR6
Correlation of scores with factors             0.97 0.90 0.88 0.82 0.77  0.69
Multiple R square of scores with factors       0.95 0.81 0.78 0.67 0.59  0.48
Minimum correlation of possible factor scores  0.89 0.63 0.56 0.34 0.19 -0.05
# count factors with eigenvalues > 1 and variance explained > 5%
efa_d4_all_unrotated_nfactors <- efa_d4_all_unrotated_eigenvalues %>%
  filter(SS.loadings > 1, Proportion.Explained > 0.05) %>%
  count() %>%
  as.numeric()
efa_d4_all_unrotated_nfactors
[1] 2
efa_d4_all_rotated_max <- fa(d4_all, 6, rotate = chosenRotType,
                           cor = chosenCorType, fm = "minres")
The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
efa_d4_all_rotated <- fa(d4_all, efa_d4_all_unrotated_nfactors, rotate = chosenRotType,
                           cor = chosenCorType, fm = "minres")
# check that each of these factors is the dominant factor for at least one mental capacity item
efa_d4_all_rotated_loadings <- fa.sort(loadings(efa_d4_all_rotated)[]) %>%
  data.frame() %>%
  rownames_to_column("capacity") %>%
  gather(factor, loading, -capacity) %>%
  mutate(loading_abs = abs(loading)) %>%
  group_by(capacity) %>%
  top_n(1, loading_abs) %>%
  ungroup()
efa_d4_all_rotated_loadings
# drop any factors where n < 1
efa_d4_all_rotated_loadings %>% 
  count(factor) %>% 
  filter(n > 0)
# set number of factors to extract
nfactors_d4_all <- efa_d4_all_rotated_loadings %>% 
  count(factor) %>% 
  filter(n > 0) %>%
  nrow()
nfactors_d4_all
[1] 2

Step 2: Run EFA with rotation

# run EFA with rotation with N factors
efa_d4_all_rotatedN <- fa(d4_all, nfactors_d4_all, 
                          rotate = chosenRotType, cor = chosenCorType, 
                          fm = "minres", 
                          n.iter = 5000) # many iter for bootstrapped CIs
The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
An ultra-Heywood case was detected.  Examine the results carefully A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
 A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
An ultra-Heywood case was detected.  Examine the results carefullyconvergence not obtained in GPFoblq. 1000 iterations used. A loading greater than abs(1) was detected.  Examine the loadings carefully.The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
The estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
print(efa_d4_all_rotatedN)
Factor Analysis with confidence intervals using method = fa(r = d4_all, nfactors = nfactors_d4_all, n.iter = 5000, rotate = chosenRotType, 
    fm = "minres", cor = chosenCorType)
Factor Analysis using method =  minres
Call: fa(r = d4_all, nfactors = nfactors_d4_all, n.iter = 5000, rotate = chosenRotType, 
    fm = "minres", cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
               MR1   MR2   h2   u2 com
angry         0.61  0.08 0.44 0.56 1.0
choices       0.31  0.29 0.29 0.71 2.0
conscious     0.28  0.32 0.29 0.71 2.0
depressed     0.67 -0.07 0.40 0.60 1.0
depth         0.03  0.52 0.30 0.70 1.0
disrespected  0.66  0.01 0.45 0.55 1.0
embarrassed   0.45  0.14 0.30 0.70 1.2
fear          0.54  0.09 0.36 0.64 1.1
guilt         0.16  0.46 0.32 0.68 1.2
happy         0.73 -0.05 0.49 0.51 1.0
hungry        0.68  0.10 0.55 0.45 1.0
love          0.71 -0.15 0.40 0.60 1.1
nauseated     0.66  0.01 0.45 0.55 1.0
odors         0.57  0.06 0.37 0.63 1.0
pain          0.47  0.09 0.28 0.72 1.1
pride         0.72 -0.05 0.47 0.53 1.0
reasoning     0.16  0.47 0.34 0.66 1.2
remembering  -0.03  0.57 0.31 0.69 1.0
temperature  -0.03  0.70 0.46 0.54 1.0
tired         0.51  0.30 0.53 0.47 1.6

                       MR1  MR2
SS loadings           5.58 2.22
Proportion Var        0.28 0.11
Cumulative Var        0.28 0.39
Proportion Explained  0.72 0.28
Cumulative Proportion 0.72 1.00

 With factor correlations of 
    MR1 MR2
MR1 1.0 0.6
MR2 0.6 1.0

Mean item complexity =  1.2
Test of the hypothesis that 2 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  8.76 with Chi Square of  994.76
The degrees of freedom for the model are 151  and the objective function was  2.16 

The root mean square of the residuals (RMSR) is  0.06 
The df corrected root mean square of the residuals is  0.07 

The harmonic number of observations is  120 with the empirical chi square  177.45  with prob <  0.07 
The total number of observations was  122  with Likelihood Chi Square =  242.36  with prob <  3.4e-06 

Tucker Lewis Index of factoring reliability =  0.855
RMSEA index =  0.078  and the 90 % confidence intervals are  0.054 0.087
BIC =  -483.05
Fit based upon off diagonal values = 0.97
Measures of factor score adequacy             
                                                MR1  MR2
Correlation of scores with factors             0.95 0.88
Multiple R square of scores with factors       0.91 0.78
Minimum correlation of possible factor scores  0.82 0.56

 Coefficients and bootstrapped confidence intervals 
                low   MR1 upper    low   MR2 upper
angry        -35.40  0.61 38.04 -35.78  0.08 37.72
choices      -28.87  0.31 30.83 -28.90  0.29 30.78
conscious    -29.76  0.28 31.64 -29.75  0.32 31.67
depressed    -36.64  0.67 39.24 -37.20 -0.07 38.78
depth        -19.39  0.03 20.63 -19.06  0.52 20.96
disrespected -39.83  0.66 42.61 -40.32  0.01 42.19
embarrassed  -31.47  0.45 33.61 -31.71  0.14 33.42
fear         -39.53  0.54 42.05 -39.85  0.09 41.75
guilt        -28.74  0.16 30.45 -28.54  0.46 30.60
happy        -39.26  0.73 42.18 -39.87 -0.05 41.67
hungry       -38.91  0.68 41.89 -39.32  0.10 41.52
love         -33.23  0.71 35.79 -33.88 -0.15 35.23
nauseated    -39.30  0.66 42.05 -39.80  0.01 41.63
odors        -36.42  0.57 38.94 -36.76  0.06 38.62
pain         -31.97  0.47 34.13 -32.27  0.09 33.89
pride        -38.68  0.72 41.52 -39.24 -0.05 41.01
reasoning    -24.82  0.16 26.48 -24.59  0.47 26.65
remembering  -18.95 -0.03 20.10 -18.52  0.57 20.46
temperature  -24.98 -0.03 26.42 -24.51  0.70 26.82
tired        -42.93  0.51 45.75 -43.10  0.30 45.63

 Interfactor correlations and bootstrapped confidence intervals 
        lower estimate upper
MR1-MR2  0.33      0.6  0.66
# get loadings for each factor
efa_d4_all_rotatedN_loadings <- loadings(efa_d4_all_rotatedN)[] %>%
  data.frame() %>% 
  rownames_to_column(var = "capacity")

back to TOC

Factor loadings table

data.frame(loadings(fa.sort(efa_d4_all_rotatedN))[]) %>%
  rownames_to_column("capacity") %>%
  mutate_at(vars(starts_with("M")), funs(round2))

Big factor loadings table for all studies (Studies 1-4)

# manually set 3 factors
order_s1_manual <- loadings(fa.sort(fa(d1_all, nfactors = 3,
                                       rotate = chosenRotType, cor = chosenCorType)))[] %>%
  data.frame() %>%
  rownames_to_column(var = "capacity") %>%
  rownames_to_column(var = "order1_manual") %>%
  rename(s1_heart = MR2, s1_body = MR1, s1_mind = MR3)
order_s1 <- loadings(fa.sort(efa_d1_all_rotatedN))[] %>%
  data.frame() %>%
  rownames_to_column(var = "capacity") %>%
  rownames_to_column(var = "order1") %>%
  rename(s1_heart = MR2, s1_body = MR1, s1_mind = MR3)
order_s2 <- loadings(fa.sort(efa_d2_all_rotatedN))[] %>%
  data.frame() %>%
  rownames_to_column(var = "capacity") %>%
  rename(s2_body = MR2, s2_heart = MR1, s2_mind = MR3)
order_s3 <- loadings(fa.sort(efa_d3_all_rotatedN))[] %>%
  data.frame() %>%
  rownames_to_column(var = "capacity") %>%
  rename(s3_body = MR1, s3_heart = MR2, s3_mind = MR3)
order_s4 <- loadings(fa.sort(efa_d4_all_rotatedN))[] %>%
  data.frame() %>%
  rownames_to_column(var = "capacity") %>%
  rename(s4_body = MR1, 
         # s4_heart = MR3, 
         s4_mind = MR2)
# manually set 3 factors
order_s4_manual <- loadings(fa.sort(fa(d1_all, nfactors = 3,
                                       rotate = chosenRotType, cor = chosenCorType)))[] %>%
  data.frame() %>%
  rownames_to_column(var = "capacity") %>%
  rownames_to_column(var = "order1_manual") %>%
  rename(s4_heart = MR2, s4_body = MR1, s4_mind = MR3)
bigTable <- order_s1_manual %>% # could substitute order_s1
  full_join(order_s2) %>%
  full_join(order_s3) %>%
  full_join(order_s4_manual) %>% # could substitute order_s4
  mutate_at(vars(starts_with("s")), funs(round2)) %>%
  select(order1_manual, # could subistitute order_s1
         capacity, ends_with("heart"), ends_with("body"), ends_with("mind")) 
Joining, by = "capacity"
Joining, by = "capacity"
Joining, by = c("order1_manual", "capacity")
bigTable

Figures

3D scatterplots

Factor loadings for the 40 mental capacities on the three rotated factors in Study 1. Items are colored by their dominant factor loading: Items that loaded most strongly on the body factor (bodily states and will) are in red; items that loaded most strongly on the heart factor (social-emotional experiences and morality) are in blue; and items that loaded most strongly on the mind factor (perceptual-cognitive abilities and goal pursuit) are in green.

Study 1 (adults)

# set up labels for plot (shortened version of mental capacity items)
wording_s1 <- loadings(efa_d1_all_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  select(item) %>%
  mutate(wording = factor(
    recode(item,
           happy = "feel happy",
           depressed = "feel sad",
           fear = "feel scared",
           angry = "get angry",
           calm = "feel calm",
           sounds = "hear sounds",
           seeing = "see things",
           temperature = "sense temperatures",
           odors = "smell things",
           depth = "sense whether something is close by or far away",
           computations = "do math",
           thoughts = "have thoughts",
           reasoning = "figure out how to do things",
           remembering = "remember things",
           beliefs = "have beliefs, like when you think something is true",
           hungry = "get hungry",
           tired = "feel tired",
           pain = "feel pain",
           nauseated = "feel sick, like when you feel like you might throw up",
           safe = "feel safe",
           love = "feel love",
           recognizing = "recognize somebody else",
           communicating = "communicate with somebody else",
           guilt = "feel guilty",
           disrespected = "get hurt feelings",
           free_will = "decide what to do",
           choices = "make choices",
           self_restraint = "have self-control, like when you stop yourself from doing something you shouldn't do",
           intentions = "make plans",
           goal = "have goals, like when you're working hard to do something or make something happen",
           conscious = "be aware of things",
           self_aware = "be aware of itself",
           desires = "have desires, like when you really want something",
           embarrassed = "feel embarrassed",
           emo_recog = "understand how somebody else is feeling",
           joy = "feel joy",
           morality = "know what's nice and what's mean",
           personality = "have a personality, like when someone is shy and somebody else is silly",
           pleasure = "feel pleasure, like when something feels really good",
           pride = "feel proud"))) %>%
    mutate(short = factor(
      recode(item,
             happy = "happy",
             depressed = "sad",
           fear = "scared",
           angry = "angry",
           calm = "calm",
           sounds = "hear",
           seeing = "see",
           temperature = "temperatures",
           odors = "smell",
           depth = "depth",
           computations = "math",
           thoughts = "thoughts",
           reasoning = "figure out",
           remembering = "remember",
           beliefs = "beliefs",
           hungry = "hungry",
           tired = "tired",
           pain = "pain",
           nauseated = "sick",
           safe = "safe",
           love = "love",
           recognizing = "recognize",
           communicating = "communicate",
           guilt = "guilty",
           disrespected = "hurt feelings",
           free_will = "decide",
           choices = "choices",
           self_restraint = "self-control",
           intentions = "plans",
           goal = "goals",
           conscious = "aware",
           self_aware = "self-aware",
           desires = "desires",
           embarrassed = "embarrassed",
           emo_recog = "empathy",
           joy = "joy",
           morality = "morality",
           personality = "personality",
           pleasure = "pleasure",
           pride = "pride")))
# make dataframe for plotting
scatter_plotting <- loadings(efa_d1_all_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  rename(BODY = MR1,
         HEART = MR2,
         MIND = MR3) %>%
  full_join(wording_s1) %>%
  mutate(dominant = factor(
    ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), "BODY",
           ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), "HEART",
                  ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), "MIND",
                         NA)))),
    size = ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), abs(BODY),
                  ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), abs(HEART),
                         ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), abs(MIND),
                                NA))),
    color = ifelse(dominant == "BODY", "#E41A1C",
                   ifelse(dominant == "HEART", "#377EB8",
                          ifelse(dominant == "MIND", "#4DAF4A",
                                 NA))))
Joining, by = "item"
# plot!
figS1 <- plot_ly(scatter_plotting, x = ~HEART, y = ~BODY, z = ~MIND,
             type = "scatter3d",
             color = ~dominant, colors = c("#377EB8", "#4DAF4A", "#E41A1C"),
             marker = list(size = 4),
             text = ~short,
             textfont = list(size = 15),
             mode = "text+markers",
             showlegend = TRUE)
figS1

Study 2 (7-9yo)

# set up labels for plot (shortened version of mental capacity items)
wording_s2 <- loadings(efa_d2_all_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  select(item) %>%
  mutate(wording = factor(
    recode(item,
           happy = "feel happy",
           depressed = "feel sad",
           fear = "feel scared",
           angry = "get angry",
           calm = "feel calm",
           sounds = "hear sounds",
           seeing = "see things",
           temperature = "sense temperatures",
           odors = "smell things",
           depth = "sense whether something is close by or far away",
           computations = "do math",
           thoughts = "have thoughts",
           reasoning = "figure out how to do things",
           remembering = "remember things",
           beliefs = "have beliefs, like when you think something is true",
           hungry = "get hungry",
           tired = "feel tired",
           pain = "feel pain",
           nauseated = "feel sick, like when you feel like you might throw up",
           safe = "feel safe",
           love = "feel love",
           recognizing = "recognize somebody else",
           communicating = "communicate with somebody else",
           guilt = "feel guilty",
           disrespected = "get hurt feelings",
           free_will = "decide what to do",
           choices = "make choices",
           self_restraint = "have self-control, like when you stop yourself from doing something you shouldn't do",
           intentions = "make plans",
           goal = "have goals, like when you're working hard to do something or make something happen",
           conscious = "be aware of things",
           self_aware = "be aware of itself",
           desires = "have desires, like when you really want something",
           embarrassed = "feel embarrassed",
           emo_recog = "understand how somebody else is feeling",
           joy = "feel joy",
           morality = "know what's nice and what's mean",
           personality = "have a personality, like when someone is shy and somebody else is silly",
           pleasure = "feel pleasure, like when something feels really good",
           pride = "feel proud"))) %>%
    mutate(short = factor(
      recode(item,
             happy = "happy",
             depressed = "sad",
           fear = "scared",
           angry = "angry",
           calm = "calm",
           sounds = "hear",
           seeing = "see",
           temperature = "temperatures",
           odors = "smell",
           depth = "depth",
           computations = "math",
           thoughts = "thoughts",
           reasoning = "figure out",
           remembering = "remember",
           beliefs = "beliefs",
           hungry = "hungry",
           tired = "tired",
           pain = "pain",
           nauseated = "sick",
           safe = "safe",
           love = "love",
           recognizing = "recognize",
           communicating = "communicate",
           guilt = "guilty",
           disrespected = "hurt feelings",
           free_will = "decide",
           choices = "choices",
           self_restraint = "self-control",
           intentions = "plans",
           goal = "goals",
           conscious = "aware",
           self_aware = "self-aware",
           desires = "desires",
           embarrassed = "embarrassed",
           emo_recog = "empathy",
           joy = "joy",
           morality = "morality",
           personality = "personality",
           pleasure = "pleasure",
           pride = "pride")))
# make dataframe for plotting
scatter_plotting <- loadings(efa_d2_all_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  rename(BODY = MR1,
         HEART = MR2,
         MIND = MR3) %>%
  full_join(wording_s2) %>%
  mutate(dominant = factor(
    ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), "BODY",
           ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), "HEART",
                  ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), "MIND",
                         NA)))),
    size = ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), abs(BODY),
                  ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), abs(HEART),
                         ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), abs(MIND),
                                NA))),
    color = ifelse(dominant == "BODY", "#E41A1C",
                   ifelse(dominant == "HEART", "#4DAF4A",
                          ifelse(dominant == "MIND", "#E41A1C",
                                 NA))))
Joining, by = "item"
# plot!
figS2 <- plot_ly(scatter_plotting, x = ~HEART, y = ~BODY, z = ~MIND,
             type = "scatter3d",
             color = ~dominant, colors = c("#377EB8", "#4DAF4A", "#E41A1C"),
             marker = list(size = 4),
             text = ~short,
             textfont = list(size = 15),
             mode = "text+markers",
             showlegend = TRUE)
figS2

Study 3 (7-9yo)

# set up labels for plot (shortened version of mental capacity items)
wording_s3 <- loadings(efa_d3_all_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  select(item) %>%
  mutate(wording = factor(
    recode(item,
           happy = "feel happy",
           depressed = "feel sad",
           fear = "feel scared",
           angry = "get angry",
           calm = "feel calm",
           sounds = "hear sounds",
           seeing = "see things",
           temperature = "sense temperatures",
           odors = "smell things",
           # depth = "sense whether something is close by or far away",
           depth = "sense... far away",
           computations = "do math",
           thoughts = "have thoughts",
           reasoning = "figure out how to do things",
           remembering = "remember things",
           # beliefs = "have beliefs, like when you think something is true",
           beliefs = "have beliefs...",
           hungry = "get hungry",
           tired = "feel tired",
           pain = "feel pain",
           # nauseated = "feel sick, like when you feel like you might throw up",
           nauseated = "feel sick...",
           safe = "feel safe",
           love = "feel love",
           recognizing = "recognize somebody else",
           communicating = "communicate with somebody else",
           guilt = "feel guilty",
           disrespected = "get hurt feelings",
           free_will = "decide what to do",
           choices = "make choices",
           # self_restraint = "have self-control, like when you stop yourself from doing something you shouldn't do",
           self_restraint = "have self-control...",
           intentions = "make plans",
           # goal = "have goals, like when you're working hard to do something or make something happen",
           goal = "have goals...",
           conscious = "be aware of things",
           self_aware = "be aware of itself",
           # desires = "have desires, like when you really want something",
           desires = "have desires...",
           embarrassed = "feel embarrassed",
           emo_recog = "understand how somebody else is feeling",
           joy = "feel joy",
           morality = "know what's nice and what's mean",
           # personality = "have a personality, like when someone is shy and somebody else is silly",
           personality = "have a personality...",
           # pleasure = "feel pleasure, like when something feels really good",
           pleasure = "feel pleasure...",
           pride = "feel proud"))) %>%
    mutate(short = factor(
      recode(item,
             happy = "happy",
             depressed = "sad",
           fear = "scared",
           angry = "angry",
           calm = "calm",
           sounds = "hear",
           seeing = "see",
           temperature = "temperatures",
           odors = "smell",
           depth = "depth",
           computations = "math",
           thoughts = "thoughts",
           reasoning = "figure out",
           remembering = "remember",
           beliefs = "beliefs",
           hungry = "hungry",
           tired = "tired",
           pain = "pain",
           nauseated = "sick",
           safe = "safe",
           love = "love",
           recognizing = "recognize",
           communicating = "communicate",
           guilt = "guilty",
           disrespected = "hurt feelings",
           free_will = "decide",
           choices = "choices",
           self_restraint = "self-control",
           intentions = "plans",
           goal = "goals",
           conscious = "aware",
           self_aware = "self-aware",
           desires = "desires",
           embarrassed = "embarrassed",
           emo_recog = "empathy",
           joy = "joy",
           morality = "morality",
           personality = "personality",
           pleasure = "pleasure",
           pride = "pride")))
# make dataframe for plotting
scatter_plotting <- loadings(efa_d3_all_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  rename(BODY = MR1,
         HEART = MR2,
         MIND = MR3) %>%
  full_join(wording_s3) %>%
  mutate(dominant = factor(
    ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), "BODY",
           ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), "HEART",
                  ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), "MIND",
                         NA)))),
    size = ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), abs(BODY),
                  ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), abs(HEART),
                         ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), abs(MIND),
                                NA))),
    color = ifelse(dominant == "BODY", "#E41A1C",
                   ifelse(dominant == "HEART", "#4DAF4A",
                          ifelse(dominant == "MIND", "#E41A1C",
                                 NA))))
Joining, by = "item"
# plot!
figs3 <- plot_ly(scatter_plotting, x = ~HEART, y = ~BODY, z = ~MIND,
             type = "scatter3d",
             color = ~dominant, colors = c("#377EB8", "#4DAF4A", "#E41A1C"),
             marker = list(size = 4),
             text = ~short,
             textfont = list(size = 15),
             mode = "text+markers",
             showlegend = TRUE)
figs3

Study 4 (4-6yo)

# set up labels for plot (shortened version of mental capacity items)
wording_s4 <- loadings(efa_d4_all_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  select(item) %>%
  mutate(wording = factor(
    recode(item,
           happy = "feel happy",
           depressed = "feel sad",
           fear = "feel scared",
           angry = "get angry",
           calm = "feel calm",
           sounds = "hear sounds",
           seeing = "see things",
           temperature = "sense temperatures",
           odors = "smell things",
           # depth = "sense whether something is close by or far away",
           depth = "sense... far away",
           computations = "do math",
           thoughts = "have thoughts",
           reasoning = "figure out how to do things",
           remembering = "remember things",
           # beliefs = "have beliefs, like when you think something is true",
           beliefs = "have beliefs...",
           hungry = "get hungry",
           tired = "feel tired",
           pain = "feel pain",
           # nauseated = "feel sick, like when you feel like you might throw up",
           nauseated = "feel sick...",
           safe = "feel safe",
           love = "feel love",
           recognizing = "recognize somebody else",
           communicating = "communicate with somebody else",
           guilt = "feel guilty",
           disrespected = "get hurt feelings",
           free_will = "decide what to do",
           choices = "make choices",
           # self_restraint = "have self-control, like when you stop yourself from doing something you shouldn't do",
           self_restraint = "have self-control...",
           intentions = "make plans",
           # goal = "have goals, like when you're working hard to do something or make something happen",
           goal = "have goals...",
           conscious = "be aware of things",
           self_aware = "be aware of itself",
           # desires = "have desires, like when you really want something",
           desires = "have desires...",
           embarrassed = "feel embarrassed",
           emo_recog = "understand how somebody else is feeling",
           joy = "feel joy",
           morality = "know what's nice and what's mean",
           # personality = "have a personality, like when someone is shy and somebody else is silly",
           personality = "have a personality...",
           # pleasure = "feel pleasure, like when something feels really good",
           pleasure = "feel pleasure...",
           pride = "feel proud"))) %>%
    mutate(short = factor(
      recode(item,
             happy = "happy",
             depressed = "sad",
           fear = "scared",
           angry = "angry",
           calm = "calm",
           sounds = "hear",
           seeing = "see",
           temperature = "temperatures",
           odors = "smell",
           depth = "depth",
           computations = "math",
           thoughts = "thoughts",
           reasoning = "figure out",
           remembering = "remember",
           beliefs = "beliefs",
           hungry = "hungry",
           tired = "tired",
           pain = "pain",
           nauseated = "sick",
           safe = "safe",
           love = "love",
           recognizing = "recognize",
           communicating = "communicate",
           guilt = "guilty",
           disrespected = "hurt feelings",
           free_will = "decide",
           choices = "choices",
           self_restraint = "self-control",
           intentions = "plans",
           goal = "goals",
           conscious = "aware",
           self_aware = "self-aware",
           desires = "desires",
           embarrassed = "embarrassed",
           emo_recog = "empathy",
           joy = "joy",
           morality = "morality",
           personality = "personality",
           pleasure = "pleasure",
           pride = "pride")))
# # make dataframe for plotting
# scatter_plotting <- loadings(efa_d4_all_rotatedN)[] %>%
#   data.frame() %>%
#   rownames_to_column(var = "item") %>%
#   rename(BODY = MR1,
#          HEART = MR2,
#          MIND = MR3) %>%
#   full_join(wording_s4) %>%
#   mutate(dominant = factor(
#     ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), "BODY",
#            ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), "HEART",
#                   ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), "MIND",
#                          NA)))),
#     size = ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), abs(BODY),
#                   ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), abs(HEART),
#                          ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), abs(MIND),
#                                 NA))),
#     color = ifelse(dominant == "BODY", "#E41A1C",
#                    ifelse(dominant == "HEART", "#4DAF4A",
#                           ifelse(dominant == "MIND", "#E41A1C",
#                                  NA))))
# 
# # plot!
# figs4 <- plot_ly(scatter_plotting, x = ~HEART, y = ~BODY, z = ~MIND,
#              type = "scatter3d",
#              color = ~dominant, colors = c("#377EB8", "#4DAF4A", "#E41A1C"),
#              marker = list(size = 4),
#              text = ~short,
#              textfont = list(size = 15),
#              mode = "text+markers",
#              showlegend = TRUE)
# 
# figs4

Heatmaps

NOTE: set to 3 factors manually, for now.

Study 1 (adults)

factors_s1 <- fa.sort(fa(d1_all, nfactors = 3, cor = chosenCorType, rotate = chosenRotType)$loadings[]) %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  full_join(wording_s1) %>%
  select(wording, MR1, MR2, MR3) %>%
  rename(capacity = wording, Factor1 = MR1, Factor2 = MR2, Factor3 = MR3) %>%
  rownames_to_column(var = "order") %>%
  mutate(order = as.numeric(order))
Joining, by = "item"
factors_s1_long <- factors_s1 %>%
  gather(factor, loading, -capacity, -order) %>%
  mutate(factor = factor(gsub("Factor", "F", factor))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F1", "F3", "F2"))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F2", "F1", "F3"))) %>%
  arrange(order, factor)
factors_s1_blank1 <- factors_s1_long %>%
  mutate(loading = rep(100, length(factors_s1_long$loading)))
# factors_s1_blank2 <- factors_s1_long %>%
#   mutate(loading = ifelse(factor == "F1", loading, rep(100, length(factors_s1_long$loading)*2/3)))
factors_s1_blank2 <- factors_s1_long %>%
  mutate(loading = ifelse(factor == "F2", loading, rep(100, length(factors_s1_long$loading)*2/3)))
factors_s1_blank3 <- factors_s1_long %>%
  mutate(loading = ifelse(factor != "F3", loading, rep(100, length(factors_s1_long$loading)*1/3)))
# ggplot(factors_s1_blank1, aes(x = factor,
#                             y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s1_blank2, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s1_blank3, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
ggplot(factors_s1_long, aes(x = factor,
                            y = reorder(capacity, desc(order)), fill = loading)) +
  geom_tile(color = "black") +
  geom_text(aes(label = format(round(loading, 2), nsmall = 2)), size = 6) +
  scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
                       guide = guide_colorbar(title = element_blank(),
                                              barheight = 20)) +
  scale_x_discrete(position = "top") +
  # geom_rect(aes(xmin = 0.51, xmax = 1.49, ymin = 14.55, ymax = 20.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 1.51, xmax = 2.49, ymin = 6.55, ymax = 14.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 2.51, xmax = 3.49, ymin = 0.55, ymax = 6.45),
  #           alpha = 0, color = "black", size = .5) +
  # theme_bw() +
  theme_minimal() +
  theme(text = element_text(size = 24),
        axis.text.x = element_text(size = 28),
        axis.title = element_blank(),
        panel.grid = element_blank()) # 1000 by 1000

Study 2 (7-9y)

factors_s2 <- fa.sort(fa(d2_all, nfactors = 3, cor = chosenCorType, rotate = chosenRotType)$loadings[]) %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  full_join(wording_s2) %>%
  select(wording, MR1, MR2, MR3) %>%
  rename(capacity = wording, Factor1 = MR1, Factor2 = MR2, Factor3 = MR3) %>%
  rownames_to_column(var = "order") %>%
  mutate(order = as.numeric(order))
Joining, by = "item"
factors_s2_long <- factors_s2 %>%
  gather(factor, loading, -capacity, -order) %>%
  mutate(factor = factor(gsub("Factor", "F", factor))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F1", "F3", "F2"))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F2", "F1", "F3"))) %>%
  arrange(order, factor)
factors_s2_blank1 <- factors_s2_long %>%
  mutate(loading = rep(100, length(factors_s2_long$loading)))
factors_s2_blank2 <- factors_s2_long %>%
  mutate(loading = ifelse(factor == "F1", loading, rep(100, length(factors_s2_long$loading)*2/3)))
# factors_s2_blank2 <- factors_s2_long %>%
#   mutate(loading = ifelse(factor == "F2", loading, rep(100, length(factors_s2_long$loading)*2/3)))
factors_s2_blank3 <- factors_s2_long %>%
  mutate(loading = ifelse(factor != "F3", loading, rep(100, length(factors_s2_long$loading)*1/3)))
# ggplot(factors_s2_blank1, aes(x = factor,
#                             y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s2_blank2, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s2_blank3, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
ggplot(factors_s2_long, aes(x = factor,
                            y = reorder(capacity, desc(order)), fill = loading)) +
  geom_tile(color = "black") +
  geom_text(aes(label = format(round(loading, 2), nsmall = 2)), size = 6) +
  scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
                       guide = guide_colorbar(title = element_blank(),
                                              barheight = 20)) +
  scale_x_discrete(position = "top") +
  # geom_rect(aes(xmin = 0.51, xmax = 1.49, ymin = 14.55, ymax = 20.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 1.51, xmax = 2.49, ymin = 6.55, ymax = 14.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 2.51, xmax = 3.49, ymin = 0.55, ymax = 6.45),
  #           alpha = 0, color = "black", size = .5) +
  # theme_bw() +
  theme_minimal() +
  theme(text = element_text(size = 24),
        axis.text.x = element_text(size = 28),
        axis.title = element_blank(),
        panel.grid = element_blank()) # 1000 by 1000

Study 3 (7-9y)

factors_s3 <- fa.sort(fa(d3_all, nfactors = 3, cor = chosenCorType, rotate = chosenRotType)$loadings[]) %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  left_join(char_plotting_wordings, by = c("item" = "capacity")) %>%
  select(wording, MR1, MR2, MR3) %>%
  rename(capacity = wording, Factor1 = MR1, Factor2 = MR2, Factor3 = MR3) %>%
  rownames_to_column(var = "order") %>%
  mutate(order = as.numeric(order))
factors_s3_long <- factors_s3 %>%
  gather(factor, loading, -capacity, -order) %>%
  mutate(factor = factor(gsub("Factor", "F", factor))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  # #                        levels = c("F1", "F3", "F2"))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F2", "F1", "F3"))) %>%
  arrange(order, factor)
factors_s3_blank1 <- factors_s3_long %>%
  mutate(loading = rep(100, length(factors_s3_long$loading)))
# factors_s3_blank2 <- factors_s3_long %>%
#   mutate(loading = ifelse(factor == "F1", loading, rep(100, length(factors_s3_long$loading)*2/3)))
factors_s3_blank2 <- factors_s3_long %>%
  mutate(loading = ifelse(factor == "F2", loading, rep(100, length(factors_s3_long$loading)*2/3)))
factors_s3_blank3 <- factors_s3_long %>%
  mutate(loading = ifelse(factor != "F3", loading, rep(100, length(factors_s3_long$loading)*1/3)))
# ggplot(factors_s3_blank1, aes(x = factor,
#                             y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s3_blank2, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s3_blank3, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
ggplot(factors_s3_long, aes(x = factor(factor, labels = c("Body", "Mind", "Heart")),
                            y = reorder(capacity, desc(order)), fill = loading)) +
  geom_tile(color = "black") +
  geom_text(aes(label = format(round(loading, 2), nsmall = 2)), size = 6) +
  scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
                       guide = guide_colorbar(title = element_blank(),
                                              barheight = 20)) +
  scale_x_discrete(position = "top") +
  # geom_rect(aes(xmin = 0.51, xmax = 1.49, ymin = 14.55, ymax = 20.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 1.51, xmax = 2.49, ymin = 6.55, ymax = 14.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 2.51, xmax = 3.49, ymin = 0.55, ymax = 6.45),
  #           alpha = 0, color = "black", size = .5) +
  # theme_bw() +
  theme_minimal() +
  labs(x = "Study 2 (7-9y)") +
  theme(text = element_text(size = 28),
        axis.text.x = element_blank(),
        axis.title.y = element_blank(),
        panel.grid = element_blank()) # 1000 by 1000

Study 4 (4-6y)

factors_s4 <- fa.sort(fa(d4_all, nfactors = nfactors_d4_all, cor = chosenCorType, rotate = chosenRotType)$loadings[]) %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  left_join(char_plotting_wordings, by = c("item" = "capacity")) %>%
  select(wording, starts_with("MR")) %>%
  rename(capacity = wording, Factor1 = MR1, Factor2 = MR2) %>% #, Factor3 = MR3) %>%
  rownames_to_column(var = "order") %>%
  mutate(order = as.numeric(order))
factors_s4_long <- factors_s4 %>%
  gather(factor, loading, -capacity, -order) %>%
  mutate(factor = factor(gsub("Factor", "F", factor))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F1", "F3", "F2"))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F2", "F1", "F3"))) %>%
  arrange(order, factor)
factors_s4_blank1 <- factors_s4_long %>%
  mutate(loading = rep(100, length(factors_s4_long$loading)))
# factors_s4_blank2 <- factors_s4_long %>%
#   mutate(loading = ifelse(factor == "F1", loading, rep(100, length(factors_s4_long$loading)*2/3)))
factors_s4_blank2 <- factors_s4_long %>%
  mutate(loading = ifelse(factor == "F2", loading, rep(100, length(factors_s4_long$loading)*2/3)))
factors_s4_blank3 <- factors_s4_long %>%
  mutate(loading = ifelse(factor != "F3", loading, rep(100, length(factors_s4_long$loading)*1/3)))
# ggplot(factors_s4_blank1, aes(x = factor,
#                             y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s4_blank2, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s4_blank3, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
ggplot(factors_s4_long, aes(x = factor(factor, labels = c("Body-Heart", "Mind")),
                            y = reorder(capacity, desc(order)), fill = loading)) +
  geom_tile(color = "black") +
  geom_text(aes(label = format(round(loading, 2), nsmall = 2)), size = 6) +
  scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
                       guide = guide_colorbar(title = element_blank(),
                                              barheight = 20)) +
  scale_x_discrete(position = "top") +
  # geom_rect(aes(xmin = 0.51, xmax = 1.49, ymin = 14.55, ymax = 20.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 1.51, xmax = 2.49, ymin = 6.55, ymax = 14.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 2.51, xmax = 3.49, ymin = 0.55, ymax = 6.45),
  #           alpha = 0, color = "black", size = .5) +
  # theme_bw() +
  theme_minimal() +
  labs(x = "Study 1 (4-6y)") +
  theme(text = element_text(size = 28),
        axis.text.x = element_blank(),
        axis.title.y = element_blank(),
        panel.grid = element_blank()) # 1000 by 1000

efa_d4_all_forced3N <- fa(d4_all, nfactors = 3, cor = chosenCorType, rotate = chosenRotType)
factors_s4_3fac <- fa.sort(efa_d4_all_forced3N$loadings[]) %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  left_join(char_plotting_wordings, by = c("item" = "capacity")) %>%
  select(wording, starts_with("MR")) %>%
  rename(capacity = wording, Factor1 = MR1, Factor2 = MR2, Factor3 = MR3) %>%
  rownames_to_column(var = "order") %>%
  mutate(order = as.numeric(order))
factors_s4_3fac_long <- factors_s4_3fac %>%
  gather(factor, loading, -capacity, -order) %>%
  mutate(factor = factor(gsub("Factor", "F", factor))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F1", "F3", "F2"))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F2", "F1", "F3"))) %>%
  arrange(order, factor)
factors_s4_3fac_blank1 <- factors_s4_3fac_long %>%
  mutate(loading = rep(100, length(factors_s4_3fac_long$loading)))
# factors_s4_3fac_blank2 <- factors_s4_3fac_long %>%
#   mutate(loading = ifelse(factor == "F1", loading, rep(100, length(factors_s4_3fac_long$loading)*2/3)))
factors_s4_3fac_blank2 <- factors_s4_3fac_long %>%
  mutate(loading = ifelse(factor == "F2", loading, rep(100, length(factors_s4_3fac_long$loading)*2/3)))
factors_s4_3fac_blank3 <- factors_s4_3fac_long %>%
  mutate(loading = ifelse(factor != "F3", loading, rep(100, length(factors_s4_3fac_long$loading)*1/3)))
# ggplot(factors_s4_3fac_blank1, aes(x = factor,
#                             y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s4_3fac_blank2, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s4_3fac_blank3, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
ggplot(factors_s4_3fac_long, aes(x = factor(factor),
                            y = reorder(capacity, desc(order)), fill = loading)) +
  geom_tile(color = "black") +
  geom_text(aes(label = format(round(loading, 2), nsmall = 2)), size = 6) +
  scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
                       guide = guide_colorbar(title = element_blank(),
                                              barheight = 20)) +
  scale_x_discrete(position = "top") +
  # geom_rect(aes(xmin = 0.51, xmax = 1.49, ymin = 14.55, ymax = 20.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 1.51, xmax = 2.49, ymin = 6.55, ymax = 14.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 2.51, xmax = 3.49, ymin = 0.55, ymax = 6.45),
  #           alpha = 0, color = "black", size = .5) +
  # theme_bw() +
  theme_minimal() +
  labs(x = "Study 1 (4-6y)") +
  theme(text = element_text(size = 28),
        axis.text.x = element_blank(),
        axis.title.y = element_blank(),
        panel.grid = element_blank()) # 1000 by 1000

Congruence

# factor congruence
factor.congruence(efa_d3_all_rotatedN, efa_d4_all_rotatedN)
     MR1  MR2
MR1 0.77 0.13
MR3 0.73 0.16
MR2 0.23 0.87
factor.congruence(efa_d3_all_rotatedN, efa_d4_all_forced3N)
     MR1  MR3  MR2
MR1 0.60 0.65 0.21
MR3 0.66 0.51 0.24
MR2 0.10 0.26 0.86

Mean ratings

Studies 1-2

Mean ratings of 40 mental capacities for the 2 entities included in Studies 1-2. Participants responded on a 3-point scale (0 = “no”, 0.5 = “kinda”, 1 = “yes”). Error bars are nonparametric bootstrapped 95% confidence intervals. Mental capacities are grouped according to their dominant factor loading in Study 1 (adults).

# make dataframe
s12_plotting <- char_plotting %>%
  filter(study %in% c("study 1", "study 2")) %>%
  distinct()
# plot! (ordered by study 3 factor loadings)
s12 <- ggplot(s12_plotting,
               aes(y = Mean, x = reorder(wording, desc(s1_order)),
                   colour = factor(s1_color), shape = study)) +
  geom_point(stat = "identity", position = position_dodge(width = 0.6), size = 2) +
  geom_errorbar(aes(ymin = Lower, ymax = Upper), width = 0.4,
                position = position_dodge(width = 0.6)) +
  facet_wrap(~ character) +
  theme_bw() +
  scale_y_continuous(name = "\nMean rating",
                     limits = c(0, 1),
                     breaks = c(0, 0.5, 1),
                     labels = c("0\n(no)", "0.5\n(kinda)", "1\n(yes)")) +
  scale_shape_discrete(name = "Study:",
                       labels = c("Study 1: adults", "Study 2: 7-9y")) +
  # scale_colour_brewer(name = "Factor:",
  #                     type = "qual", palette = 6,
  #                     guide = FALSE) +
  scale_colour_manual(name = "Factor:",
                      values = c("#E41A1C", "#4DAF4A", "#377EB8"),
                      labels = c("BODY", "MIND", "HEART")) +
  coord_flip() +
  theme(text = element_text(size = 9),
      axis.title.y = element_blank(),
      axis.text.y = element_text(face = "italic",
                                 colour = palette_s1),
      panel.grid.minor = element_blank(),
      legend.position = "right")
s12

Studies 3-4

Mean ratings of 20 mental capacities for the 9 entities included in Studies 3-4. Participants responded on a 3-point scale (0 = “no”, 0.5 = “kinda”, 1 = “yes”). Error bars are nonparametric bootstrapped 95% confidence intervals. Mental capacities are grouped according to their dominant factor loading in Study 3 (7-9y).

# make dataframe
s34_plotting <- char_plotting %>%
  filter(study %in% c("study 3", "study 4"),
         !is.na(s3_order), !is.na(character), !is.na(capacity)) %>%
  distinct() %>%
  mutate(character = factor(character,
                            levels = c("computer", "doll", "teddy_bear", "robot", 
                                       "beetle", "bird", "mouse", "goat", "elephant")))
# plot! (ordered by study 3 factor loadings)
s34 <- ggplot(s34_plotting,
               aes(y = Mean, x = reorder(wording, desc(s3_order)), 
                   # colour = study,
                   colour = s3_color,
                   shape = study)) +
  geom_point(stat = "identity", position = position_dodge(width = 0.6), size = 2) +
  geom_errorbar(aes(ymin = Lower, ymax = Upper), width = 0.4,
                position = position_dodge(width = 0.6)) +
  facet_wrap(~ character, ncol = 9) +
  theme_bw() +
  scale_y_continuous(name = "\nMean rating",
                     limits = c(0, 1),
                     breaks = c(0, 0.5, 1),
                     labels = c("0\n(no)", "0.5\n(kinda)", "1\n(yes)")) +
  scale_shape_discrete(name = "Study:",
                       labels = c("Study 3: 7-9y", "Study 4: 4-6y")) +
  # scale_colour_discrete(name = "Study:",
  #                      labels = c("Study 3: 7-9y", "Study 4: 4-6y")) +
  # scale_colour_brewer(name = "Factor:",
  #                     type = "qual", palette = 6,
  #                     guide = FALSE) +
  scale_colour_manual(name = "Factor:",
                      values = c("#E41A1C", "#377EB8", "#4DAF4A"),
                      labels = c("BODY", "HEART", "MIND")) +
  coord_flip() +
  theme(text = element_text(size = 9),
      axis.title.y = element_blank(),
      axis.text.y = element_text(face = "italic"),
                                 # colour = palette_s1),
      panel.grid.minor = element_blank(),
      legend.position = "bottom")
s34

Mean factor scores

Studies 1-2

# tempC <- d1 %>% mutate(subid = paste(character, subid, sep = "_")) %>%
#   full_join(d2 %>% mutate(subid = paste(character, subid, sep = "_"))) %>%
#   full_join(data.frame(efa_d12_all_rotatedN$scores) %>%
#             rownames_to_column("subid") %>%
#               gather(factor, score, -subid)) %>%
#   mutate(factor = factor(factor),
#          age_group = factor(age_group),
#          character = factor(character)) # %>%
#   # filter(!is.na(factor), !is.na(age_group), !is.na(character))
# 
# contrasts(tempC$factor) = cbind(factor1 = c(1, -1, 0),
#                                 factor3 = c(0, -1, 1))
# 
# contrasts(tempC$age_group) = cbind(children = c(-1, 1))
# contrasts(tempC$character) = cbind(robot = c(-1, 1))
# 
# library(lme4)
# r1 <- lmer(score ~ character * factor * age_group + (1 | subid) , tempC)
# summary(r1)
# 
# # library(brms)
# # r1b <- brm(score ~ character * factor * age_group + (1 | subid) , tempC,
# #             family = "gaussian")
# # summary(r1b)
# project 7-9yo data into adult space
temp_predict_79 <- predict(efa_d1_all_rotatedN, d2_all, d1_all) %>%
  data.frame() %>%
  rownames_to_column("subid")
# round(cor(efa_d1_all_rotatedN$scores, temp_predict_79[,-1], use = "complete.obs"), 3)
temp_combo_adult <- efa_d1_all_rotatedN$scores %>% data.frame() %>%
  rownames_to_column("subid") %>%
  full_join(temp_predict_79)
Joining, by = c("subid", "MR1", "MR2", "MR3")
scores_s12 <- d1 %>%
  select(age_group, subid, age, character) %>%
  distinct() %>%
  mutate(subid = paste(character, subid, sep = "_")) %>%
  full_join(d2 %>%
              select(age_group, subid, age, character) %>%
              distinct() %>%
              mutate(subid = paste(character, subid, sep = "_"))) %>%
  full_join(temp_combo_adult) %>%
  mutate(character = factor(character)) %>%
  mutate(age = ifelse(age < 6.5, NA, age)) %>%
  rename(score_F1 = MR1, score_F2 = MR2, score_F3 = MR3) %>%
  filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
  gather(factor, score, starts_with("score_")) %>%
  mutate(factor = factor(factor))
Joining, by = c("age_group", "subid", "age", "character")
Column `character` joining factors with different levels, coercing to character vectorJoining, by = "subid"
scores_s12_plotting <- scores_s12 %>%
  group_by(age_group, character, factor) %>%
  do(data.frame(rbind(smean.cl.boot(.$score))))
# plot
ggplot(scores_s12_plotting %>%
         ungroup() %>%
         mutate(factor = factor(factor,
                                labels = c("HEART",
                                           "BODY",
                                           "MIND")),
                age_group = factor(age_group,
                                  # levels = c("adults", "children_79"),
                                  # labels = c("adults", "children"))),
                                  levels = c("children_79", "adults"),
                                  labels = c("children", "adults"))),
       aes(x = age_group, y = Mean, color = character, shape = character)) +
  facet_wrap("factor", ncol = 3) +
  theme_bw() +
  theme(text = element_text(size = 20),
        legend.position = "bottom") +
  geom_point(size = 5, position = position_dodge(width = 0.4)) +
  geom_errorbar(aes(ymin = Lower, ymax = Upper),
                width = 0.1, position = position_dodge(width = 0.4)) +
  scale_shape_manual(values = c(19, 15)) +
  labs(title = "Factor scores by age group",
       # subtitle = "Adults (Study 1) vs. children (Study 2)\n",
       x = "Age group",
       y = "Mean factor score") # 1000 by 500

Study 3

ggplot(scores_s3_plotting %>%
         ungroup() %>%
         mutate(character = factor(character, 
                                   levels = c("computer", "robot", "doll", "teddy_bear",
                                              "beetle", "bird", "mouse", "goat", "elephant"),
                                   labels = c("computer", "robot", "doll", "teddy bear",
                                              "beetle", "bird", "mouse", "goat", "elephant")),
                factor = factor(factor,
                                levels = c("score_F2", "score_F1", "score_F3"),
                                labels = c("Social-emotional", "Bodily", "Perceptual-cognitive"))),
       aes(x = character, y = Mean, color = character, shape = character)) +
  facet_wrap(~ factor, ncol = 3) +
  theme_bw() +
  theme(text = element_text(size = 28),
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
        legend.position = "none") +
  geom_point(size = 5, position = position_dodge(width = 0.4)) +
  geom_errorbar(aes(ymin = Lower, ymax = Upper), 
                width = 0.2, position = position_dodge(width = 0.4)) +
  # scale_color_manual(values = c("black", "#00BFC4", "#F8766D", rep("black", 4))) +
  # scale_shape_manual(values = c(17, 15, 19, rep(17, 4))) +
  scale_color_manual(values = c("black", "#00BFC4", rep("gray", 2), "#F8766D", rep("black", 4))) +
  scale_shape_manual(values = c(17, 15, rep(17, 2), 19, rep(17, 4))) +
  labs(title = "Factor scores by character",
       x = "Character",
       y = "Mean factor score") # 1000 by 500

Studies 3-4

# # Cronbach's alpha (subscales)
# keys.list_s34 <- list(HEART = c("pride", "depressed", "disrespected", "happy", 
#                            "love", "embarrassed", "angry", "guilt"),
#                   BODY = c("hungry", "odors", "fear", "tired", "pain", "nauseated"),
#                   MIND = c("temperature", "reasoning", "remembering", "choices",  
#                            "depth", "conscious")) 
# scores <- scoreItems(keys.list_s34, d34_all, min = 0, max = 1)  # or just use the keys.lit
# # summary(scores)
# scores
# 
# # omega
# omega(d34_all, 3, plot = F)
# plot (old way, not projection!)
ggplot(scores_s34_plotting %>%
         ungroup() %>%
         mutate(character = factor(character, 
                                   levels = c("computer", "robot", "doll", 
                                              "teddy_bear", "beetle", "bird", 
                                              "mouse", "goat", "elephant"),
                                   labels = c("computer", "robot", "doll", 
                                              "teddy bear", "beetle", "bird", 
                                              "mouse", "goat", "elephant")),
                factor = factor(factor,
                                levels = c("score_F1", "score_F2", "score_F3"),
                                labels = c("Heart", "Mind", "Body")),
                age_group = factor(age_group,
                                   levels = c("children_46", "children_79"),
                                   labels = c("4-6y", "7-9y"))),
       aes(x = character, y = Mean, 
           color = age_group)) +
           # color = character, 
           # shape = age_group)) +
  facet_wrap(~ factor, ncol = 3) +
  theme_bw() +
  theme(text = element_text(size = 28),
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
        legend.position = "bottom") +
  geom_point(size = 5, position = position_dodge(width = 0.4)) +
  geom_errorbar(aes(ymin = Lower, ymax = Upper), 
                width = 0.2, position = position_dodge(width = 0.4)) +
  # scale_color_manual(values = c("black", "#00BFC4", "#F8766D", rep("black", 4))) +
  # scale_shape_manual(values = c(17, 15, 19, rep(17, 4))) +
  # scale_color_manual(values = c("black", "#00BFC4", rep("gray", 2), "#F8766D", rep("black", 4)),
                     # guide = FALSE) +
  scale_color_brewer(palette = "Set1", direction = -1) +
  labs(#title = "Factor scores by character and age group",
       x = "Character",
       y = "Mean factor score",
       color = "Age group: ") # 1000 by 500

Factor scores by age

Study 1

scores_s1_plotting <- d1 %>% 
  select(subid, age, character) %>% 
  distinct() %>% 
  mutate(subid = paste(character, subid, sep = "_")) %>%
  full_join(efa_d1_all_rotatedN$scores %>% 
              data.frame() %>% 
              rownames_to_column("subid")) %>%
  mutate(character = factor(character)) %>%
  rename(score_F1 = MR1, score_F2 = MR2, score_F3 = MR3) %>%
  filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
  gather(factor, score, starts_with("score_")) %>%
  mutate(factor = factor(factor))
Joining, by = "subid"
ggplot(scores_s1_plotting %>%
         ungroup() %>%
         mutate(factor = factor(factor,
                                levels = c("score_F1", "score_F2", "score_F3"),
                                labels = c("Social-emotional",
                                           "Bodily",
                                           "Perceptual-cognitive"))),
       aes(x = age, y = score, color = character, fill = character, shape = character)) +
  facet_wrap("factor", ncol = 3) +
  theme_bw() +
  theme(text = element_text(size = 28),
        legend.position = "bottom") +
  # geom_smooth(method = "loess", alpha = 0.4) +
  geom_smooth(method = "lm", alpha = 0.4) +
  geom_point(size = 2) +
  scale_shape_manual(values = c(19, 15)) +
  labs(title = "Factor scores by adults' age",
       # subtitle = "Adults (Study 1)\n",
       x = "Age (years)",
       y = "Factor score") # 1000 by 500

Study 2

scores_s2_plotting <- d2 %>% 
  select(subid, age, character) %>% 
  distinct() %>% 
  mutate(subid = paste(character, subid, sep = "_")) %>%
  full_join(efa_d2_all_rotatedN$scores %>% 
              data.frame() %>% 
              rownames_to_column("subid")) %>%
  mutate(character = factor(character)) %>%
  rename(score_F1 = MR1, score_F2 = MR2, score_F3 = MR3) %>%
  filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
  gather(factor, score, starts_with("score_")) %>%
  mutate(factor = factor(factor))
Joining, by = "subid"
ggplot(scores_s2_plotting %>%
         ungroup() %>%
         mutate(factor = factor(factor,
                                labels = c("Social-emotional",
                                           "Bodily",
                                           "Perceptual-cognitive"))),
       aes(x = age, y = score, color = character, fill = character, shape = character)) +
  facet_wrap("factor", ncol = 3) +
  theme_bw() +
  theme(text = element_text(size = 28),
        legend.position = "bottom") +
  # geom_smooth(method = "loess", alpha = 0.4) +
  geom_smooth(method = "lm", alpha = 0.4) +
  geom_point(size = 2) +
  scale_shape_manual(values = c(19, 15)) +
  labs(title = "Factor scores by children's age",
       # subtitle = "Children (Study 2)\n",
       x = "Age (years)",
       y = "Factor score") # 1000 by 500

Studies 1-2

tempA <- d2 %>% 
  select(subid, age, character) %>% 
  distinct() %>% 
  mutate(subid = paste(character, subid, sep = "_")) %>%
  full_join(scores_s12) %>%
  mutate(character = factor(character)) %>%
  filter(age_group == "children_79", !is.na(score), !is.na(age)) %>%
  # spread(factor, score) %>%
  # filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
  # gather(factor, score, starts_with("score_")) %>%
  mutate(factor = factor(factor,
                         # labels = c("Social-emotional",
                         #            "Bodily",
                         #            "Perceptual-cognitive")))
                         labels = c("HEART",
                                    "BODY",
                                    "MIND")))
Joining, by = c("subid", "age", "character")
Column `character` joining factors with different levels, coercing to character vector
tempB <- scores_s12_plotting %>%
  filter(age_group == "adults") %>%
  ungroup() %>%
  mutate(factor = factor(factor,
                         # labels = c("Social-emotional",
                         #            "Bodily",
                         #            "Perceptual-cognitive")),
                         labels = c("HEART",
                                    "BODY",
                                    "MIND")),
         age = 11) %>%
  distinct()
ggplot(tempA,
       aes(x = age, y = score, color = character, fill = character, shape = character)) +
  facet_wrap("factor", ncol = 3) +
  theme_bw() +
  theme(text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        legend.position = "bottom") +
  # geom_smooth(method = "loess", alpha = 0.4) +
  geom_smooth(method = "lm", alpha = 0.4) +
  geom_point(size = 2) +
  geom_point(data = tempB %>% 
               mutate(factor(factor)), 
             aes(y = Mean),
             size = 4, position = position_dodge(width = 0.6)) +
  geom_errorbar(data = tempB, aes(ymin = Lower, ymax = Upper, y = Mean), width = 0.4,
                position = position_dodge(width = 0.6)) +
  scale_shape_manual(values = c(19, 15)) +
  scale_x_continuous(breaks = c(7:11), labels = c("7y", "8y", "9y", "10y", "adults")) +
  labs(#title = "Factor scores by age",
       # subtitle = "Children (Study 2)\n",
       x = "Age",
       y = "Factor score") # 1000 by 500
Ignoring unknown aesthetics: y

Studies 3-4

# scores_s34_plotting <- d3 %>%
#   select(age_group, subid, age, character) %>%
#   distinct() %>%
#   mutate(subid = paste(character, subid, sep = "_")) %>%
#   full_join(d4 %>%
#               select(age_group, subid, age, character) %>%
#               distinct() %>%
#               mutate(subid = paste(character, subid, sep = "_"))) %>%
#   full_join(efa_d34_all_rotatedN$scores %>%
#               data.frame() %>%
#               rownames_to_column("subid")) %>%
#   mutate(character = factor(character)) %>%
#   mutate(age = ifelse(age < 3.5, NA, age)) %>%
#   rename(score_F1 = MR1, score_F2 = MR2, score_F3 = MR3) %>%
#   filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
#   gather(factor, score, starts_with("score_")) %>%
#   mutate(factor = factor(factor))
# project 4-6yo data into 7-9yo space
temp_predict <- predict(efa_d3_all_rotatedN, d4_all, d3_all) %>%
  data.frame() %>%
  rownames_to_column("subid")
# round(cor(efa_d4_all_rotatedN$scores, temp_predict, use = "complete.obs"), 3)
temp_combo <- efa_d3_all_rotatedN$scores %>% data.frame() %>%
  rownames_to_column("subid") %>%
  full_join(temp_predict)
Joining, by = c("subid", "MR1", "MR3", "MR2")
scores_s34_plotting <- d3 %>%
  select(age_group, subid, age, character) %>%
  distinct() %>%
  mutate(subid = paste(character, subid, sep = "_")) %>%
  full_join(d4 %>%
              select(age_group, subid, age, character) %>%
              distinct() %>%
              mutate(subid = paste(character, subid, sep = "_"))) %>%
  full_join(temp_combo) %>%
  mutate(character = factor(character)) %>%
  mutate(age = ifelse(age < 3.5, NA, age)) %>%
  rename(score_F1 = MR1, score_F2 = MR2, score_F3 = MR3) %>%
  filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
  gather(factor, score, starts_with("score_")) %>%
  mutate(factor = factor(factor))
Joining, by = c("age_group", "subid", "age", "character")
Column `character` joining factors with different levels, coercing to character vectorJoining, by = "subid"
# ggplot(scores_s34_plotting %>%
#          ungroup() %>%
#          mutate(factor = factor(factor,
#                                 levels = c("score_F1", "score_F2", "score_F3"),
#                                 labels = c("Heart",
#                                            "Mind",
#                                            "Body")),
#                 character = factor(character,
#                                    levels = c("computer", "robot", "doll", "teddy_bear",
#                                               "beetle", "bird", "mouse", "goat", "elephant"))),
#        # aes(x = age, y = score, color = character, fill = character, shape = character)) +
#        aes(x = age, y = score, group = age_group)) +
#   # facet_wrap("factor", ncol = 3) +
#   facet_grid(factor ~ character) +
#   # facet_grid(character ~ factor) +
#   theme_bw() +
#   theme(text = element_text(size = 28),
#         legend.position = "none") +
#   # geom_smooth(method = "loess", alpha = 0.4) +
#   geom_smooth(method = "lm", alpha = 0.4) +
#   # geom_smooth(method = "lm", alpha = 0.4, formula = y ~ poly(x, 2)) +
#   # geom_smooth(method = "lm", alpha = 0.4, formula = y ~ poly(x, 3)) +
#   geom_point(size = 2) +
#   scale_x_continuous(breaks = seq(2, 12, 2)) +
#   # scale_fill_manual(values = c("black", "#00BFC4", rep("gray", 2), "#F8766D", rep("black", 4))) +
#   # scale_color_manual(values = c("black", "#00BFC4", rep("gray", 2), "#F8766D", rep("black", 4))) +
#   # scale_shape_manual(values = c(17, 15, rep(17, 2), 19, rep(17, 4))) +
#   labs(title = "Factor scores by children's age",
#        # subtitle = "Children (Studies 3-4)\n",
#        x = "Age (years)",
#        y = "Factor score") # 1000 by 500
# 
# 
ggplot(scores_s34_plotting %>%
         ungroup() %>%
         mutate(factor = factor(factor,
                                levels = c("score_F1", "score_F3", "score_F2"),
                                labels = c("BODY", "HEART", "MIND")),
                                # levels = c("score_F1", "score_F2", "score_F3"),
                                # labels = c("Heart",
                                #            "Mind",
                                #            "Body")),
                character = factor(gsub("_", " ", character),
                                   levels = c("computer", "robot", "doll",
                                              "teddy bear", "beetle", "bird",
                                              "mouse", "goat", "elephant")),
                age_group = factor(age_group,
                                   levels = c("children_46", "children_79"))),
       aes(x = age, y = score)) +
       # aes(x = age, y = score, group = age_group)) +
  # facet_wrap("factor", ncol = 3) +
  facet_grid(factor ~ character) +
  # facet_grid(character ~ factor) +
  theme_bw() +
  theme(text = element_text(size = 28),
        legend.position = "bottom") +
  # geom_smooth(method = "loess", alpha = 0.4) +
  geom_smooth(method = "lm", alpha = 0.2, color = "black") +
  # geom_smooth(method = "lm", alpha = 0.4, formula = y ~ poly(x, 2)) +
  # geom_smooth(method = "lm", alpha = 0.4, formula = y ~ poly(x, 3)) +
  geom_point(size = 2, aes(color = age_group)) +
  scale_x_continuous(breaks = seq(2, 12, 2)) +
  # scale_fill_manual(values = c("black", "#00BFC4", rep("gray", 2), "#F8766D", rep("black", 4))) +
  # scale_color_manual(values = c("black", "#00BFC4", rep("gray", 2), "#F8766D", rep("black", 4))) +
  # scale_shape_manual(values = c(17, 15, rep(17, 2), 19, rep(17, 4))) +
  scale_color_brewer("Age group", labels = c("4-6y", "7-9y"),
                     palette = "Set1", direction = -1) +
  labs(#title = "Factor scores by children's age",
       # subtitle = "Children (Studies 3-4)\n",
       x = "Age (years)",
       y = "Factor score") # 1000 by 500

contrasts(scores_s34_plotting$factor) <- 
  cbind(heart = c(1, 0, -1),
        mind = c(0, 1, -1))
contrasts(scores_s34_plotting$character) <- 
  cbind(animate = c(5, 5, -4, -4, 5, 5, 5, -4, -4),
        mammal = c(-3, -3, 0, 0, 2, 2, 2, 0, 0),
        elephant = c(0, 0, 0, 0, 2, -1, -1, 0, 0),
        goat = c(0, 0, 0, 0, 0, 1, -1, 0, 0),
        bird = c(-1, 1, 0, 0, 0, 0, 0, 0, 0),
        tech = c(0, 0, 1, -1, 0, 0, 0, 1, -1),
        robot = c(0, 0, -1, 0, 0, 0, 0, 1, 0),
        teddy = c(0, 0, 0, -1, 0, 0, 0, 0, 1))
# reg_temp <- lmer(score ~ factor * character * scale(age, scale = F) + (1 | character) + (1 | subid), data = scores_s34_plotting)
# summary(reg_temp)
pvals <- data.frame()
for(i in levels(scores_s34_plotting$character)) {
  for(j in levels(scores_s34_plotting$factor)) {
    res <- summary(lm(score ~ scale(age, scale = F),
                      data = scores_s34_plotting %>% filter(character == i, factor == j)))
    p <- round(res$coefficients[2, 4], 3)
    pvals[i, j] <- p
  }
}
pvals <- pvals %>% 
  select(score_F3, score_F1, score_F2) %>%
  rownames_to_column("character") %>%
  mutate(character = factor(character, 
                            levels = c("computer", "robot", "doll", "teddy_bear",
                                       "beetle", "bird", "mouse", "goat", "elephant"))) %>%
  arrange(character)
pvals
pvals %>% 
  gather(factor, p, -character) %>%
  filter(p < 0.05/(nrow(pvals) * ncol(pvals))) %>%
  spread(factor, p)
pvals_cat <- data.frame()
for(i in levels(scores_s34_plotting$character)) {
  for(j in levels(scores_s34_plotting$factor)) {
    res <- summary(lm(score ~ age_group,
                      data = scores_s34_plotting %>% filter(character == i, factor == j)))
    p <- round(res$coefficients[2, 4], 3)
    pvals_cat[i, j] <- p
  }
}
pvals_cat <- pvals_cat %>% 
  select(score_F3, score_F1, score_F2) %>%
  rownames_to_column("character") %>%
  mutate(character = factor(character, 
                            levels = c("computer", "robot", "doll", "teddy_bear",
                                       "beetle", "bird", "mouse", "goat", "elephant"))) %>%
  arrange(character)
pvals_cat
pvals_cat %>% 
  gather(factor, p, -character) %>%
  filter(p < 0.05/(nrow(pvals_cat) * ncol(pvals_cat))) %>%
  spread(factor, p)
ggplot(scores_s34_plotting %>%
         mutate(factor = factor(factor,
                                levels = c("score_F1", "score_F3", "score_F2"),
                                labels = c("BODY", "HEART", "MIND"))) %>%
         spread(factor, score),
       aes(x = BODY, y = HEART, 
           color = age_group, fill = age_group, group = age_group)) +
  geom_point() +
  geom_smooth(method = "lm", alpha = 0.2) +
  theme_bw()

ggplot(scores_s34_plotting %>%
         mutate(factor = factor(factor,
                                levels = c("score_F1", "score_F3", "score_F2"),
                                labels = c("BODY", "HEART", "MIND"))) %>%
         spread(factor, score),
       aes(x = BODY, y = MIND, 
           color = age_group, fill = age_group, group = age_group)) +
  geom_point() +
  geom_smooth(method = "lm", alpha = 0.2) +
  theme_bw()

ggplot(scores_s34_plotting %>%
         mutate(factor = factor(factor,
                                levels = c("score_F1", "score_F3", "score_F2"),
                                labels = c("BODY", "HEART", "MIND"))) %>%
         spread(factor, score),
       aes(x = HEART, y = MIND, 
           color = age_group, fill = age_group, group = age_group)) +
  geom_point() +
  geom_smooth(method = "lm", alpha = 0.2) +
  theme_bw()

scores_s34_plotting %>%
  filter(age_group == "children_79") %>%
  mutate(factor = factor(factor,
                         levels = c("score_F1", "score_F3", "score_F2"),
                         labels = c("BODY", "HEART", "MIND"))) %>%
  spread(factor, score) %>%
  select(BODY, HEART, MIND) %>%
  cor()
           BODY     HEART      MIND
BODY  1.0000000 0.5421433 0.4496306
HEART 0.5421433 1.0000000 0.4007229
MIND  0.4496306 0.4007229 1.0000000
scores_s34_plotting %>%
  filter(age_group == "children_46") %>%
  mutate(factor = factor(factor,
                         levels = c("score_F1", "score_F3", "score_F2"),
                         labels = c("BODY", "HEART", "MIND"))) %>%
  spread(factor, score) %>%
  select(BODY, HEART, MIND) %>%
  cor()
           BODY     HEART      MIND
BODY  1.0000000 0.6991161 0.6053140
HEART 0.6991161 1.0000000 0.6392113
MIND  0.6053140 0.6392113 1.0000000
scores_s34_lm <- scores_s34_plotting %>%
  filter(age_group == "children_46") %>%
  mutate(factor = factor(factor,
                         levels = c("score_F1", "score_F3", "score_F2"),
                         labels = c("BODY", "HEART", "MIND"))) %>%
  spread(factor, score)
summary(lmer(HEART ~ BODY * scale(age, scale = F) + (1 | character), 
             scores_s34_lm))
Linear mixed model fit by REML ['lmerMod']
Formula: HEART ~ BODY * scale(age, scale = F) + (1 | character)
   Data: scores_s34_lm

REML criterion at convergence: 230

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.3760 -0.5772 -0.2183  0.7973  2.3606 

Random effects:
 Groups    Name        Variance Std.Dev.
 character (Intercept) 0.02187  0.1479  
 Residual              0.38421  0.6198  
Number of obs: 115, groups:  character, 9

Fixed effects:
                            Estimate Std. Error t value
(Intercept)                 0.059349   0.077177   0.769
BODY                        0.730164   0.072043  10.135
scale(age, scale = F)      -0.163135   0.089169  -1.830
BODY:scale(age, scale = F)  0.003734   0.089871   0.042

Correlation of Fixed Effects:
            (Intr) BODY   s(,s=F
BODY         0.163              
scl(g,sc=F) -0.027 -0.084       
BODY:(,s=F) -0.048  0.032  0.233
summary(lmer(MIND ~ BODY * scale(age, scale = F) + (1 | character), 
             scores_s34_lm))
Linear mixed model fit by REML ['lmerMod']
Formula: MIND ~ BODY * scale(age, scale = F) + (1 | character)
   Data: scores_s34_lm

REML criterion at convergence: 270.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.2049 -0.6245 -0.1414  0.5812  2.2751 

Random effects:
 Groups    Name        Variance Std.Dev.
 character (Intercept) 0.01887  0.1374  
 Residual              0.55851  0.7473  
Number of obs: 115, groups:  character, 9

Fixed effects:
                            Estimate Std. Error t value
(Intercept)                -0.332875   0.084851  -3.923
BODY                        0.662356   0.084028   7.883
scale(age, scale = F)       0.005836   0.106831   0.055
BODY:scale(age, scale = F) -0.033039   0.108062  -0.306

Correlation of Fixed Effects:
            (Intr) BODY   s(,s=F
BODY         0.172              
scl(g,sc=F) -0.028 -0.078       
BODY:(,s=F) -0.053  0.027  0.234
summary(lmer(HEART ~ MIND * scale(age, scale = F) + (1 | character), 
             scores_s34_lm))
Linear mixed model fit by REML ['lmerMod']
Formula: HEART ~ MIND * scale(age, scale = F) + (1 | character)
   Data: scores_s34_lm

REML criterion at convergence: 240.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.1222 -0.6935 -0.1318  0.6780  2.1731 

Random effects:
 Groups    Name        Variance Std.Dev.
 character (Intercept) 0.06609  0.2571  
 Residual              0.40525  0.6366  
Number of obs: 115, groups:  character, 9

Fixed effects:
                           Estimate Std. Error t value
(Intercept)                 0.20037    0.10869   1.844
MIND                        0.59260    0.06617   8.955
scale(age, scale = F)      -0.13866    0.09544  -1.453
MIND:scale(age, scale = F) -0.08754    0.09148  -0.957

Correlation of Fixed Effects:
            (Intr) MIND   s(,s=F
MIND         0.278              
scl(g,sc=F) -0.031 -0.060       
MIND:(,s=F) -0.049 -0.033  0.335
# plot! (ordered by study 3 factor loadings)
s34_all_cat <- ggplot(d34_all %>%
                        rownames_to_column("subid") %>%
                        mutate(subid = gsub(".*_", "", subid),
                               subid = as.character(subid)) %>%
                        left_join(d3 %>%
                                    select(subid, study, character) %>%
                                    mutate(subid = as.character(subid)) %>%
                                    distinct() %>%
                                    full_join(d4 %>%
                                                select(subid, study, character) %>%
                                                mutate(subid = as.character(subid)) %>%
                                                distinct())) %>%
                        mutate(study = factor(study,
                                              levels = c("study 4", "study 3"),
                                              labels = c("4-6y", "7-9y"))) %>%
                        gather(capacity, response, angry:tired) %>%
                        # filter(!is.na(response)) %>%
                        full_join(s34_plotting %>%
                                    select(capacity, s3_factor, s3_order)) %>%
                        left_join(char_plotting_wordings) %>%
                        mutate(wording = reorder(wording, s3_order),
                               character = factor(character,
                                                  levels = c("elephant", "goat", "mouse",
                                                             "bird", "beetle",
                                                             "teddy_bear", "doll",
                                                             "robot", "computer"))),
               aes(x = study, 
                   fill = study,
                   alpha = factor(response))) + 
  geom_bar(position = "fill", color = "black") +
  scale_fill_brewer(name = "Study:", palette = "Set1", direction = -1) +
  scale_alpha_discrete(name = "Response:", labels = c("NO", "KINDA", "YES"),
                       na.value = 0) +
  theme_bw() +
  theme(text = element_text(),
        axis.title.x = element_blank(),
      axis.text.x = element_text(angle = 90, hjust = 1),
      legend.position = "bottom") +
  labs(x = "Study",
       y = "Proportion of Responses") +
  # coord_flip() +
  facet_grid(character ~ wording,
             labeller = labeller(wording = label_wrap_gen(10)))
Joining, by = c("subid", "study", "character")
Column `study` joining factors with different levels, coercing to character vectorColumn `character` joining factors with different levels, coercing to character vectorJoining, by = "subid"
Joining, by = "capacity"
Joining, by = "capacity"
  # facet_wrap(~ wording, ncol = 5)
s34_all_cat

# plot! (ordered by study 3 factor loadings)
s34_robot_cat <- ggplot(d34_all %>%
                      rownames_to_column("subid") %>%
                      filter(grepl("robot", subid)) %>%
                      mutate(subid = gsub("robot_", "", subid),
                             subid = as.character(subid)) %>%
                      left_join(d3 %>% 
                                  select(subid, study) %>% 
                                  mutate(subid = as.character(subid)) %>% 
                                  distinct() %>%
                                  full_join(d4 %>%
                                              select(subid, study) %>%
                                              mutate(subid = as.character(subid)) %>%
                                              distinct())) %>%
                      mutate(study = factor(study,
                                            levels = c("study 4", "study 3"),
                                            labels = c("4-6y", "7-9y"))) %>%
                      gather(capacity, response, angry:tired) %>%
                      full_join(s34_plotting %>% 
                                  select(capacity, wording, s3_factor, s3_order)) %>%
                        mutate(wording = reorder(wording, s3_order)),
               aes(x = study, 
                   fill = study,
                   alpha = factor(response))) + 
  geom_bar(position = "fill", color = "black") +
  scale_fill_brewer(name = "Study:", palette = "Set1", direction = -1) +
  scale_alpha_discrete(name = "Response:", labels = c("NO", "KINDA", "YES"),
                       na.value = 0) +
  theme_bw() +
  theme(text = element_text(),
        axis.title.x = element_blank(),
      axis.text.x = element_text(angle = 90, hjust = 1),
      legend.position = "top") +
  labs(x = "Study",
       y = "Proportion of Responses") +
  # coord_flip() +
  # facet_grid(capacity ~ ., switch = "y")
  facet_wrap(~ wording, ncol = 5)
Joining, by = c("subid", "study")
Column `study` joining factors with different levels, coercing to character vectorJoining, by = "subid"
Joining, by = "capacity"
s34_robot_cat

ggplot(d3_all %>%
         rownames_to_column("subid") %>%
         gather(capacity, response, -subid) %>%
         mutate(age_group = "7-9y") %>%
         full_join(d4_all %>%
                     rownames_to_column("subid") %>%
                     gather(capacity, response, -subid) %>%
                     mutate(age_group = "4-6y")) %>%
         mutate(response_cat = factor(response,
                                      levels = c(0, 0.5, 1),
                                      labels = c("no", "kinda", "yes"))),
       aes(x = age_group,
           fill = age_group,
           alpha = response_cat)) + 
  geom_bar(position = "fill", color = "black") +
  scale_fill_brewer(name = "Study:", palette = "Set1", direction = -1) +
  scale_alpha_discrete(name = "Response:", labels = c("NO", "KINDA", "YES"),
                       na.value = 0) +
  theme_bw() +
  theme(text = element_text(),
        axis.title.x = element_blank(),
      axis.text.x = element_text(angle = 90, hjust = 1),
      legend.position = "top") +
  labs(x = "Study",
       y = "Proportion of Responses")
Joining, by = c("subid", "capacity", "response", "age_group")

# 7-9y
d3_all %>% rownames_to_column("subid") %>% gather(key, value, -subid) %>% mutate(value = as.numeric(gsub(0.5, 1, value))) %>% spread(key, value) %>% remove_rownames() %>% column_to_rownames("subid") %>% fa(nfactors = 6, rotate = "none", fm = "minres") %>% fa.sort()
Factor Analysis using method =  minres
Call: fa(r = ., nfactors = 6, rotate = "none", fm = "minres")
Standardized loadings (pattern matrix) based upon correlation matrix
              MR1   MR2   MR3   MR4   MR5   MR6   h2   u2 com
fear         0.79 -0.16 -0.18  0.14 -0.06  0.09 0.71 0.29 1.3
angry        0.79 -0.16  0.03 -0.10 -0.14  0.10 0.69 0.31 1.2
tired        0.75  0.07  0.00  0.09  0.16 -0.12 0.62 0.38 1.2
depressed    0.75 -0.23  0.18 -0.17  0.02  0.05 0.67 0.33 1.4
hungry       0.74 -0.03 -0.50  0.12 -0.07  0.07 0.83 0.17 1.8
love         0.70 -0.16 -0.02  0.16  0.13 -0.09 0.56 0.44 1.3
happy        0.70 -0.19 -0.02 -0.28 -0.08 -0.29 0.69 0.31 1.9
pain         0.70 -0.17 -0.22 -0.13  0.02 -0.07 0.58 0.42 1.4
pride        0.69 -0.21  0.23 -0.14 -0.20 -0.15 0.65 0.35 1.8
odors        0.62 -0.01 -0.37  0.16 -0.01  0.04 0.55 0.45 1.8
disrespected 0.58 -0.22  0.23 -0.12  0.19  0.17 0.52 0.48 2.3
nauseated    0.52  0.11 -0.25 -0.07  0.04  0.26 0.42 0.58 2.1
conscious    0.50  0.17  0.06  0.11  0.30 -0.16 0.42 0.58 2.3
embarrassed  0.50 -0.10  0.40  0.07  0.04  0.22 0.47 0.53 2.5
reasoning    0.44  0.64  0.00  0.08  0.02 -0.21 0.65 0.35 2.1
remembering  0.37  0.59  0.14  0.15 -0.31  0.06 0.63 0.37 2.7
choices      0.49  0.50  0.11 -0.09 -0.09 -0.05 0.52 0.48 2.2
temperature  0.39  0.47  0.11 -0.21 -0.06  0.16 0.46 0.54 2.9
depth        0.31  0.43  0.11 -0.06  0.31  0.09 0.40 0.60 3.0
guilt        0.42 -0.28  0.43  0.41 -0.10 -0.03 0.62 0.38 3.8

                       MR1  MR2  MR3  MR4  MR5  MR6
SS loadings           7.35 1.82 1.06 0.54 0.47 0.41
Proportion Var        0.37 0.09 0.05 0.03 0.02 0.02
Cumulative Var        0.37 0.46 0.51 0.54 0.56 0.58
Proportion Explained  0.63 0.16 0.09 0.05 0.04 0.04
Cumulative Proportion 0.63 0.79 0.88 0.92 0.96 1.00

Mean item complexity =  2.1
Test of the hypothesis that 6 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  10.74 with Chi Square of  1229.69
The degrees of freedom for the model are 85  and the objective function was  0.98 

The root mean square of the residuals (RMSR) is  0.03 
The df corrected root mean square of the residuals is  0.04 

The harmonic number of observations is  123 with the empirical chi square  39.19  with prob <  1 
The total number of observations was  123  with Likelihood Chi Square =  108.38  with prob <  0.044 

Tucker Lewis Index of factoring reliability =  0.948
RMSEA index =  0.058  and the 90 % confidence intervals are  0.008 0.072
BIC =  -300.66
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6
Correlation of scores with factors             0.98 0.90 0.88 0.77 0.72 0.71
Multiple R square of scores with factors       0.95 0.82 0.77 0.59 0.51 0.50
Minimum correlation of possible factor scores  0.91 0.63 0.54 0.18 0.03 0.00
d3_all %>% rownames_to_column("subid") %>% gather(key, value, -subid) %>% mutate(value = as.numeric(gsub(0.5, 1, value))) %>% spread(key, value) %>% remove_rownames() %>% column_to_rownames("subid") %>% fa(nfactors = 3, rotate = "oblimin", fm = "minres") %>% fa.sort()
Factor Analysis using method =  minres
Call: fa(r = ., nfactors = 3, rotate = "oblimin", fm = "minres")
Standardized loadings (pattern matrix) based upon correlation matrix
               MR1   MR3   MR2   h2   u2 com
depressed     0.73  0.13  0.01 0.66 0.34 1.1
pride         0.70  0.06  0.04 0.56 0.44 1.0
embarrassed   0.68 -0.21  0.13 0.40 0.60 1.3
disrespected  0.67  0.00 -0.01 0.44 0.56 1.0
guilt         0.66 -0.16 -0.06 0.33 0.67 1.1
angry         0.57  0.31  0.05 0.65 0.35 1.6
happy         0.48  0.31  0.00 0.50 0.50 1.7
love          0.45  0.34  0.02 0.51 0.49 1.9
tired         0.37  0.31  0.28 0.57 0.43 2.8
hungry       -0.05  0.92  0.04 0.82 0.18 1.0
odors        -0.01  0.71  0.06 0.54 0.46 1.0
fear          0.35  0.58  0.00 0.68 0.32 1.6
pain          0.29  0.55 -0.04 0.55 0.45 1.5
nauseated     0.02  0.47  0.18 0.33 0.67 1.3
reasoning    -0.12  0.08  0.77 0.60 0.40 1.1
choices       0.09 -0.01  0.69 0.52 0.48 1.0
remembering  -0.01 -0.05  0.68 0.44 0.56 1.0
temperature   0.07 -0.04  0.60 0.37 0.63 1.0
depth         0.04 -0.06  0.53 0.27 0.73 1.0
conscious     0.24  0.12  0.31 0.28 0.72 2.2

                       MR1  MR3  MR2
SS loadings           4.12 3.28 2.61
Proportion Var        0.21 0.16 0.13
Cumulative Var        0.21 0.37 0.50
Proportion Explained  0.41 0.33 0.26
Cumulative Proportion 0.41 0.74 1.00

 With factor correlations of 
     MR1  MR3  MR2
MR1 1.00 0.56 0.32
MR3 0.56 1.00 0.38
MR2 0.32 0.38 1.00

Mean item complexity =  1.4
Test of the hypothesis that 3 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  10.74 with Chi Square of  1229.69
The degrees of freedom for the model are 133  and the objective function was  1.67 

The root mean square of the residuals (RMSR) is  0.05 
The df corrected root mean square of the residuals is  0.06 

The harmonic number of observations is  123 with the empirical chi square  99.6  with prob <  0.99 
The total number of observations was  123  with Likelihood Chi Square =  187.7  with prob <  0.0013 

Tucker Lewis Index of factoring reliability =  0.923
RMSEA index =  0.066  and the 90 % confidence intervals are  0.037 0.077
BIC =  -452.32
Fit based upon off diagonal values = 0.98
Measures of factor score adequacy             
                                                MR1  MR3  MR2
Correlation of scores with factors             0.94 0.95 0.91
Multiple R square of scores with factors       0.89 0.91 0.83
Minimum correlation of possible factor scores  0.78 0.82 0.66
# 4-6y
d4_all %>% rownames_to_column("subid") %>% gather(key, value, -subid) %>% mutate(value = as.numeric(gsub(0.5, 1, value))) %>% spread(key, value) %>% remove_rownames() %>% column_to_rownames("subid") %>% fa(nfactors = 6, rotate = "none", fm = "minres") %>% fa.sort()
An ultra-Heywood case was detected.  Examine the results carefully
Factor Analysis using method =  minres
Call: fa(r = ., nfactors = 6, rotate = "none", fm = "minres")
Standardized loadings (pattern matrix) based upon correlation matrix
              MR1   MR2   MR3   MR4   MR5   MR6   h2      u2 com
tired        0.75  0.05 -0.06  0.03 -0.24  0.00 0.62  0.3790 1.2
hungry       0.74 -0.20 -0.22 -0.05 -0.23  0.08 0.70  0.3033 1.6
disrespected 0.68 -0.06  0.05 -0.29  0.02 -0.19 0.59  0.4118 1.6
angry        0.67 -0.02  0.01 -0.35 -0.17 -0.19 0.64  0.3584 1.8
pride        0.65 -0.15  0.15 -0.07  0.25  0.09 0.54  0.4570 1.6
happy        0.64 -0.24  0.28  0.25  0.18 -0.02 0.64  0.3569 2.2
nauseated    0.63 -0.21 -0.14  0.01 -0.02 -0.07 0.47  0.5333 1.4
reasoning    0.61  0.47 -0.39 -0.21  0.42  0.18 1.00 -0.0016 4.1
fear         0.59 -0.19  0.01  0.16 -0.05  0.24 0.47  0.5262 1.8
depressed    0.59 -0.12  0.09 -0.14  0.08 -0.25 0.46  0.5429 1.6
odors        0.57 -0.21 -0.18 -0.13 -0.08  0.24 0.49  0.5083 2.1
embarrassed  0.56 -0.10 -0.06  0.16 -0.01  0.05 0.35  0.6513 1.3
guilt        0.55  0.16 -0.15  0.12  0.14 -0.15 0.41  0.5911 1.7
choices      0.54  0.05 -0.01  0.14  0.08 -0.24 0.38  0.6211 1.6
love         0.54 -0.29  0.23  0.10  0.25  0.11 0.51  0.4894 2.7
pain         0.53 -0.02  0.04 -0.07 -0.16  0.06 0.31  0.6877 1.3
temperature  0.50  0.31 -0.01  0.32 -0.03 -0.18 0.49  0.5123 2.8
depth        0.45  0.30  0.00  0.17 -0.12 -0.10 0.35  0.6532 2.4
remembering  0.45  0.19 -0.19  0.25 -0.15  0.15 0.38  0.6221 3.0
conscious    0.55  0.52  0.59 -0.15 -0.12  0.21 1.00 -0.0028 3.5

                       MR1  MR2  MR3  MR4  MR5  MR6
SS loadings           7.09 1.11 0.83 0.67 0.59 0.51
Proportion Var        0.35 0.06 0.04 0.03 0.03 0.03
Cumulative Var        0.35 0.41 0.45 0.49 0.51 0.54
Proportion Explained  0.66 0.10 0.08 0.06 0.05 0.05
Cumulative Proportion 0.66 0.76 0.84 0.90 0.95 1.00

Mean item complexity =  2.1
Test of the hypothesis that 6 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  8.67 with Chi Square of  984.43
The degrees of freedom for the model are 85  and the objective function was  0.84 

The root mean square of the residuals (RMSR) is  0.03 
The df corrected root mean square of the residuals is  0.05 

The harmonic number of observations is  120 with the empirical chi square  45.72  with prob <  1 
The total number of observations was  122  with Likelihood Chi Square =  91.71  with prob <  0.29 

Tucker Lewis Index of factoring reliability =  0.98
RMSEA index =  0.04  and the 90 % confidence intervals are  0 0.058
BIC =  -316.63
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6
Correlation of scores with factors             0.97 0.93 0.97 0.79 0.86 0.76
Multiple R square of scores with factors       0.95 0.86 0.94 0.62 0.74 0.57
Minimum correlation of possible factor scores  0.90 0.72 0.88 0.25 0.47 0.15
d4_all %>% rownames_to_column("subid") %>% gather(key, value, -subid) %>% mutate(value = as.numeric(gsub(0.5, 1, value))) %>% spread(key, value) %>% remove_rownames() %>% column_to_rownames("subid") %>% fa(nfactors = 2, rotate = "oblimin", fm = "minres") %>% fa.sort()
Factor Analysis using method =  minres
Call: fa(r = ., nfactors = 2, rotate = "oblimin", fm = "minres")
Standardized loadings (pattern matrix) based upon correlation matrix
               MR1   MR2   h2   u2 com
love          0.71 -0.18 0.37 0.63 1.1
pride         0.70 -0.03 0.46 0.54 1.0
hungry        0.69  0.09 0.56 0.44 1.0
happy         0.68 -0.02 0.44 0.56 1.0
nauseated     0.65  0.01 0.43 0.57 1.0
odors         0.64 -0.06 0.37 0.63 1.0
fear          0.62 -0.01 0.38 0.62 1.0
disrespected  0.60  0.11 0.46 0.54 1.1
depressed     0.55  0.07 0.36 0.64 1.0
angry         0.53  0.18 0.44 0.56 1.2
embarrassed   0.47  0.13 0.32 0.68 1.2
tired         0.44  0.40 0.57 0.43 2.0
pain          0.42  0.15 0.28 0.72 1.3
temperature  -0.05  0.68 0.42 0.58 1.0
depth        -0.06  0.63 0.36 0.64 1.0
reasoning     0.15  0.51 0.38 0.62 1.2
remembering   0.07  0.47 0.26 0.74 1.0
guilt         0.19  0.46 0.35 0.65 1.3
conscious     0.14  0.45 0.31 0.69 1.2
choices       0.29  0.32 0.30 0.70 2.0

                       MR1  MR2
SS loadings           5.26 2.56
Proportion Var        0.26 0.13
Cumulative Var        0.26 0.39
Proportion Explained  0.67 0.33
Cumulative Proportion 0.67 1.00

 With factor correlations of 
     MR1  MR2
MR1 1.00 0.63
MR2 0.63 1.00

Mean item complexity =  1.2
Test of the hypothesis that 2 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  8.67 with Chi Square of  984.43
The degrees of freedom for the model are 151  and the objective function was  2.02 

The root mean square of the residuals (RMSR) is  0.06 
The df corrected root mean square of the residuals is  0.07 

The harmonic number of observations is  120 with the empirical chi square  160.35  with prob <  0.29 
The total number of observations was  122  with Likelihood Chi Square =  226.65  with prob <  6.6e-05 

Tucker Lewis Index of factoring reliability =  0.878
RMSEA index =  0.072  and the 90 % confidence intervals are  0.046 0.081
BIC =  -498.76
Fit based upon off diagonal values = 0.97
Measures of factor score adequacy             
                                                MR1  MR2
Correlation of scores with factors             0.95 0.90
Multiple R square of scores with factors       0.90 0.81
Minimum correlation of possible factor scores  0.80 0.61
# 7-9y
d3_all %>% rownames_to_column("subid") %>% gather(key, value, -subid) %>% mutate(value = as.numeric(gsub(0.5, NA, value))) %>% spread(key, value) %>% remove_rownames() %>% column_to_rownames("subid") %>% fa(nfactors = 6, rotate = "none", fm = "minres") %>% fa.sort()
Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
Factor Analysis using method =  minres
Call: fa(r = ., nfactors = 6, rotate = "none", fm = "minres")
Standardized loadings (pattern matrix) based upon correlation matrix
              MR1   MR2   MR3   MR4   MR5   MR6   h2    u2 com
angry        0.89 -0.10 -0.05  0.07 -0.14 -0.33 0.93 0.072 1.4
fear         0.86 -0.16 -0.28  0.00  0.18  0.01 0.87 0.132 1.4
tired        0.82  0.08 -0.11 -0.16  0.09  0.17 0.75 0.248 1.2
pride        0.81 -0.28  0.23 -0.28 -0.10 -0.19 0.91 0.088 1.9
depressed    0.80 -0.27  0.15 -0.03 -0.32  0.00 0.84 0.162 1.7
pain         0.80 -0.19 -0.29 -0.09  0.06  0.00 0.76 0.235 1.4
hungry       0.77 -0.02 -0.55  0.07  0.17 -0.04 0.92 0.075 2.0
happy        0.74 -0.18 -0.08 -0.26 -0.18 -0.09 0.70 0.302 1.6
love         0.71 -0.29  0.07 -0.05  0.18  0.17 0.66 0.338 1.6
disrespected 0.69 -0.29  0.31  0.09 -0.16  0.23 0.74 0.263 2.3
odors        0.66  0.01 -0.42  0.10  0.14 -0.07 0.65 0.355 1.9
choices      0.64  0.56  0.15 -0.05 -0.05 -0.06 0.75 0.254 2.1
guilt        0.59 -0.38  0.54  0.23  0.29 -0.03 0.92 0.079 3.6
conscious    0.57  0.34  0.06 -0.10  0.05  0.12 0.47 0.533 1.9
embarrassed  0.53 -0.23  0.50  0.12  0.09  0.08 0.62 0.383 2.6
remembering  0.43  0.70  0.31  0.23  0.14 -0.29 0.93 0.069 3.0
reasoning    0.48  0.68  0.09 -0.11  0.11  0.09 0.74 0.265 2.0
temperature  0.44  0.55  0.04 -0.01 -0.20 -0.03 0.54 0.461 2.2
depth        0.40  0.51  0.05 -0.12 -0.06  0.29 0.52 0.478 2.8
nauseated    0.55  0.06 -0.27  0.58 -0.28  0.16 0.82 0.184 3.1

                       MR1  MR2  MR3  MR4  MR5  MR6
SS loadings           9.11 2.56 1.58 0.71 0.57 0.50
Proportion Var        0.46 0.13 0.08 0.04 0.03 0.02
Cumulative Var        0.46 0.58 0.66 0.70 0.73 0.75
Proportion Explained  0.61 0.17 0.11 0.05 0.04 0.03
Cumulative Proportion 0.61 0.78 0.88 0.93 0.97 1.00

Mean item complexity =  2.1
Test of the hypothesis that 6 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  40.61 with Chi Square of  4649.56
The degrees of freedom for the model are 85  and the objective function was  23.43 

The root mean square of the residuals (RMSR) is  0.03 
The df corrected root mean square of the residuals is  0.05 

The harmonic number of observations is  79 with the empirical chi square  29.46  with prob <  1 
The total number of observations was  123  with Likelihood Chi Square =  2589.13  with prob <  0 

Tucker Lewis Index of factoring reliability =  -0.303
RMSEA index =  0.517  and the 90 % confidence intervals are  0.475 NA
BIC =  2180.09
Fit based upon off diagonal values = 1
d3_all %>% rownames_to_column("subid") %>% gather(key, value, -subid) %>% mutate(value = as.numeric(gsub(0.5, NA, value))) %>% spread(key, value) %>% remove_rownames() %>% column_to_rownames("subid") %>% fa(nfactors = 3, rotate = "oblimin", fm = "minres") %>% fa.sort()
Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was done A loading greater than abs(1) was detected.  Examine the loadings carefully.Matrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor extraction method.
Factor Analysis using method =  minres
Call: fa(r = ., nfactors = 3, rotate = "oblimin", fm = "minres")

 Warning: A Heywood case was detected. 
Standardized loadings (pattern matrix) based upon correlation matrix
               MR1   MR3   MR2   h2    u2 com
hungry        1.00 -0.16  0.03 0.90 0.097 1.1
odors         0.80 -0.10  0.08 0.62 0.383 1.1
fear          0.80  0.21  0.00 0.84 0.158 1.1
pain          0.79  0.19 -0.05 0.77 0.233 1.1
tired         0.54  0.21  0.29 0.69 0.313 1.9
angry         0.54  0.40  0.15 0.78 0.223 2.0
happy         0.51  0.36  0.03 0.58 0.422 1.8
nauseated     0.47  0.03  0.14 0.31 0.693 1.2
guilt        -0.10  0.88 -0.02 0.69 0.313 1.0
embarrassed  -0.19  0.83  0.09 0.60 0.396 1.1
disrespected  0.11  0.74  0.02 0.65 0.352 1.0
pride         0.27  0.69  0.05 0.76 0.239 1.3
depressed     0.32  0.63  0.03 0.72 0.280 1.5
love          0.38  0.53 -0.05 0.59 0.406 1.8
reasoning     0.03 -0.10  0.86 0.72 0.283 1.0
remembering  -0.18  0.06  0.84 0.65 0.349 1.1
choices       0.06  0.09  0.81 0.76 0.238 1.0
temperature   0.07 -0.07  0.69 0.50 0.504 1.0
depth         0.05 -0.06  0.63 0.40 0.597 1.0
conscious     0.17  0.11  0.53 0.44 0.557 1.3

                       MR1  MR3  MR2
SS loadings           5.09 4.21 3.66
Proportion Var        0.25 0.21 0.18
Cumulative Var        0.25 0.47 0.65
Proportion Explained  0.39 0.32 0.28
Cumulative Proportion 0.39 0.72 1.00

 With factor correlations of 
     MR1  MR3  MR2
MR1 1.00 0.48 0.38
MR3 0.48 1.00 0.28
MR2 0.38 0.28 1.00

Mean item complexity =  1.3
Test of the hypothesis that 3 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  40.61 with Chi Square of  4649.56
The degrees of freedom for the model are 133  and the objective function was  25.65 

The root mean square of the residuals (RMSR) is  0.05 
The df corrected root mean square of the residuals is  0.06 

The harmonic number of observations is  79 with the empirical chi square  80.47  with prob <  1 
The total number of observations was  123  with Likelihood Chi Square =  2885.57  with prob <  0 

Tucker Lewis Index of factoring reliability =  0.102
RMSEA index =  0.43  and the 90 % confidence intervals are  0.399 NA
BIC =  2245.55
Fit based upon off diagonal values = 0.99
# 4-6y
d4_all %>% rownames_to_column("subid") %>% gather(key, value, -subid) %>% mutate(value = as.numeric(gsub(0.5, NA, value))) %>% spread(key, value) %>% remove_rownames() %>% column_to_rownames("subid") %>% fa(nfactors = 6, rotate = "none", fm = "minres") %>% fa.sort()
Factor Analysis using method =  minres
Call: fa(r = ., nfactors = 6, rotate = "none", fm = "minres")
Standardized loadings (pattern matrix) based upon correlation matrix
              MR1   MR2   MR3   MR4   MR5   MR6   h2   u2 com
hungry       0.76 -0.09  0.01 -0.39  0.02 -0.09 0.75 0.25 1.5
tired        0.74  0.06 -0.06 -0.13 -0.16 -0.22 0.64 0.36 1.4
happy        0.69 -0.22  0.31  0.27  0.01 -0.06 0.70 0.30 2.0
angry        0.69 -0.12 -0.45 -0.05 -0.10  0.02 0.71 0.29 1.9
disrespected 0.67 -0.19 -0.31  0.13  0.09  0.21 0.65 0.35 2.0
pride        0.67 -0.19  0.13  0.09  0.10  0.07 0.52 0.48 1.4
nauseated    0.65 -0.13  0.00 -0.06  0.08  0.05 0.46 0.54 1.1
odors        0.63 -0.09  0.01 -0.35  0.00 -0.05 0.53 0.47 1.6
fear         0.62 -0.07  0.24 -0.20 -0.03 -0.05 0.49 0.51 1.6
depressed    0.62 -0.23 -0.13  0.10 -0.33  0.09 0.58 0.42 2.1
love         0.60 -0.29  0.34  0.17 -0.09 -0.02 0.59 0.41 2.4
pain         0.57 -0.07 -0.18  0.06  0.34 -0.25 0.54 0.46 2.4
embarrassed  0.56 -0.01  0.13  0.03  0.27  0.02 0.40 0.60 1.6
conscious    0.56  0.14 -0.21  0.37  0.08 -0.07 0.52 0.48 2.3
choices      0.54  0.13  0.12  0.08 -0.23  0.17 0.42 0.58 1.9
reasoning    0.53  0.29 -0.12 -0.14  0.08  0.24 0.46 0.54 2.4
temperature  0.52  0.49  0.11  0.22  0.07  0.02 0.58 0.42 2.5
guilt        0.51  0.30  0.09 -0.07  0.03  0.31 0.46 0.54 2.5
depth        0.47  0.38 -0.11  0.13 -0.21 -0.30 0.53 0.47 3.5
remembering  0.42  0.40  0.16 -0.16  0.01 -0.06 0.40 0.60 2.6

                       MR1  MR2  MR3  MR4  MR5  MR6
SS loadings           7.35 1.08 0.79 0.73 0.48 0.47
Proportion Var        0.37 0.05 0.04 0.04 0.02 0.02
Cumulative Var        0.37 0.42 0.46 0.50 0.52 0.55
Proportion Explained  0.67 0.10 0.07 0.07 0.04 0.04
Cumulative Proportion 0.67 0.77 0.85 0.91 0.96 1.00

Mean item complexity =  2
Test of the hypothesis that 6 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  9.83 with Chi Square of  1115.79
The degrees of freedom for the model are 85  and the objective function was  1.3 

The root mean square of the residuals (RMSR) is  0.04 
The df corrected root mean square of the residuals is  0.05 

The harmonic number of observations is  104 with the empirical chi square  51.93  with prob <  1 
The total number of observations was  122  with Likelihood Chi Square =  142.11  with prob <  1e-04 

Tucker Lewis Index of factoring reliability =  0.856
RMSEA index =  0.084  and the 90 % confidence intervals are  0.052 0.096
BIC =  -266.23
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6
Correlation of scores with factors             0.97 0.84 0.83 0.81 0.71 0.71
Multiple R square of scores with factors       0.95 0.70 0.68 0.66 0.51 0.50
Minimum correlation of possible factor scores  0.89 0.40 0.37 0.32 0.02 0.01
d4_all %>% rownames_to_column("subid") %>% gather(key, value, -subid) %>% mutate(value = as.numeric(gsub(0.5, NA, value))) %>% spread(key, value) %>% remove_rownames() %>% column_to_rownames("subid") %>% fa(nfactors = 2, rotate = "oblimin", fm = "minres") %>% fa.sort()
Factor Analysis using method =  minres
Call: fa(r = ., nfactors = 2, rotate = "oblimin", fm = "minres")
Standardized loadings (pattern matrix) based upon correlation matrix
               MR1   MR2   h2   u2 com
happy         0.73 -0.04 0.50 0.50 1.0
pride         0.72 -0.05 0.48 0.52 1.0
love          0.71 -0.14 0.41 0.59 1.1
depressed     0.70 -0.09 0.42 0.58 1.0
disrespected  0.69 -0.02 0.46 0.54 1.0
hungry        0.68  0.11 0.57 0.43 1.1
nauseated     0.67  0.01 0.45 0.55 1.0
angry         0.65  0.05 0.46 0.54 1.0
odors         0.59  0.06 0.40 0.60 1.0
fear          0.56  0.10 0.39 0.61 1.1
tired         0.55  0.26 0.54 0.46 1.4
pain          0.51  0.07 0.31 0.69 1.0
embarrassed   0.46  0.15 0.31 0.69 1.2
conscious     0.34  0.29 0.31 0.69 2.0
choices       0.31  0.31 0.31 0.69 2.0
temperature  -0.03  0.73 0.50 0.50 1.0
remembering  -0.04  0.61 0.34 0.66 1.0
depth         0.07  0.51 0.31 0.69 1.0
guilt         0.13  0.49 0.34 0.66 1.1
reasoning     0.17  0.47 0.35 0.65 1.3

                       MR1  MR2
SS loadings           5.89 2.29
Proportion Var        0.29 0.11
Cumulative Var        0.29 0.41
Proportion Explained  0.72 0.28
Cumulative Proportion 0.72 1.00

 With factor correlations of 
     MR1  MR2
MR1 1.00 0.59
MR2 0.59 1.00

Mean item complexity =  1.2
Test of the hypothesis that 2 factors are sufficient.

The degrees of freedom for the null model are  190  and the objective function was  9.83 with Chi Square of  1115.79
The degrees of freedom for the model are 151  and the objective function was  2.72 

The root mean square of the residuals (RMSR) is  0.07 
The df corrected root mean square of the residuals is  0.08 

The harmonic number of observations is  104 with the empirical chi square  177.48  with prob <  0.069 
The total number of observations was  122  with Likelihood Chi Square =  305.58  with prob <  1.5e-12 

Tucker Lewis Index of factoring reliability =  0.787
RMSEA index =  0.099  and the 90 % confidence intervals are  0.077 0.107
BIC =  -419.83
Fit based upon off diagonal values = 0.97
Measures of factor score adequacy             
                                                MR1  MR2
Correlation of scores with factors             0.96 0.89
Multiple R square of scores with factors       0.92 0.79
Minimum correlation of possible factor scores  0.83 0.59
LS0tCnRpdGxlOiAiRGlta2lkIENvZ1NjaSAyMDE3LCAyMDE4IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKYGBgCgojIFNldHVwCgpgYGB7ciB3b3Jrc3BhY2Ugc2V0dXB9CiMgbG9hZCBsaWJyYXJpZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobGFuZ2NvZykgIyBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5nY29nL2xhbmdjb2cKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShybXMpCmxpYnJhcnkobG1lNCkKCiMgY2xlYXIgd29ya3NwYWNlCnJtKGxpc3QgPSBscyhhbGwgPSBUKSkKZ3JhcGhpY3Mub2ZmKCkKYGBgCgpgYGB7ciBmdW5jdGlvbnN9CiMgbWFrZSByb3VuZGluZyBmdW5jdGlvbgpyb3VuZDIgPC0gZnVuY3Rpb24oeCkge2Zvcm1hdChyb3VuZCh4LCAyKSwgbnNtYWxsID0gMil9CgojIG1ha2UgY2xlYW51cCBmdW5jdGlvbgpjbGVhbnVwIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UsIGFnZV9ncm91cCkgewogIGlmKGdyZXBsKCJhZHVsdCIsIGFnZV9ncm91cCkpIHsKICAgIAogICAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICAgIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGRfcmF3X3N0dWR5MX0KICAgIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkX3Jhd19zdHVkeTFifQogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGRfcmF3X3N0dWR5MWN9CiAgICAKICAgICMgZW5hY3QgZXhjbHVzaW9uYXJ5IGNyaXRlcmlhCiAgICBkX2NsZWFuXzEgPC0gZAogICAgCiAgICAjIHJlY29kZSBiYWNrZ3JvdW5kIGFuZCBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMKICAgIGRfY2xlYW4gPC0gZF9jbGVhbl8xICU+JQogICAgICBtdXRhdGUoICMgZGVhbCB3aXRoIHN0dWR5IG51bWJlcgogICAgICAgIHN0dWR5ID0gZmFjdG9yKHN0dWR5KSkgJT4lCiAgICAgIG11dGF0ZSggIyBkZWFsIHdpdGggcmFjZQogICAgICAgIHJhY2VfY2F0MiA9IGZhY3RvcihzdWIoIiArJCIsICIiLCBldGhuaWNpdHkpKSwKICAgICAgICByYWNlX2NhdDMgPSBmYWN0b3IoaWZlbHNlKGdyZXBsKCIgIiwgcmFjZV9jYXQyKSA9PSBULCAibXVsdGlyYWNpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHJhY2VfY2F0MikpKSkgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3Qoc3R1ZHksIHN1YmlkOmNvdW50cnlfc2VsZnJlcCwgYWdlX2dyb3VwLCByYWNlX2NhdDMpICU+JQogICAgICByZW5hbWUocmFjZV9jYXQgPSByYWNlX2NhdDMpICU+JQogICAgICBtdXRhdGUoICMgZGVhbCB3aXRoIHJlbGlnaW9uIChub3RlOiBvbmx5IGRlYWxpbmcgd2l0aCBjaGlsZGhvb2QgcmVsaWdpb24gZm9yIG5vdykKICAgICAgICByZWxpZ2lvbl9jYXQyID0gZmFjdG9yKHN1YigiICskIiwgIiIsIHJlbGlnaW9uQ2hpbGQpKSwKICAgICAgICByZWxpZ2lvbl9jYXQzID0gZmFjdG9yKGlmZWxzZShncmVwbCgiICIsIHJlbGlnaW9uX2NhdDIpID09IFQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXJlbGlnaW91cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHJlbGlnaW9uX2NhdDIpKSkpICU+JQogICAgICBkcGx5cjo6c2VsZWN0KHN0dWR5OnJhY2VfY2F0LCByZWxpZ2lvbl9jYXQzKSAlPiUKICAgICAgcmVuYW1lKHJlbGlnaW9uX2NhdCA9IHJlbGlnaW9uX2NhdDMpCiAgICAKICAgICMgcmVtb3ZlIGV4dHJhbmVvdXMgZGZzIGFuZCB2YXJpYWJsZXMKICAgIHJtKGQsIGRfY2xlYW5fMSkKICB9CiAgCiAgaWYoZ3JlcGwoImNoaWxkIiwgYWdlX2dyb3VwKSkgewogICAgCiAgICAjIHNldCB0YXJnZXQgZGF0YXNldAogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZF9yYXdfc3R1ZHkyfQogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMyIpe2QgPC0gZF9yYXdfc3R1ZHkzfQogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNCIpe2QgPC0gZF9yYXdfc3R1ZHk0fQogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNSIpe2QgPC0gZF9yYXdfc3R1ZHk1fQogICAgCiAgICAjIHJlY29kZSBiYWNrZ3JvdW5kIGFuZCBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMKICAgIGRfY2xlYW5fMiA8LSBkICU+JQogICAgICBtdXRhdGUoICMgZGVhbCB3aXRoIHN0dWR5IG51bWJlcgogICAgICAgIHN0dWR5ID0gZmFjdG9yKHN0dWR5KSwKICAgICAgICByZXNwb25zZU51bSA9IGlmZWxzZSghaXMubmEocmVzcG9uc2VOdW0pLCByZXNwb25zZU51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocmVzcG9uc2UgPT0gIm5vIiwgMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyZXNwb25zZSA9PSAia2luZGEiLCAwLjUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHJlc3BvbnNlID09ICJ5ZXMiLCAxLCBOQSkpKSkpCiAgICAjIE5PVEU6IG5lZWQgdG8gcmVjb25jaWxlIHJhY2UvZXRobmljaXR5IGF0IHNvbWUgcG9pbnQuLi4KICAgICMgTk9URTogbmVlZCB0byBkZWFsIHdpdGggZ2VuZGVyIGF0IHNvbWUgcG9pbnQuLi4KICAKICAgIGRfY2xlYW4gPC0gZF9jbGVhbl8yCiAgICAKICAgICMgcmVtb3ZlIGV4dHJhbmVvdXMgZGZzIGFuZCB2YXJpYWJsZXMKICAgIHJtKGQsIGRfY2xlYW5fMikKICB9CiAgCiAgIyByZW1vdmUgb3V0bGllcnMgaWYgZGVzaXJlZAogIGlmKGNob3Nlbk91dGxpZXJIYW5kbGluZyA9PSAicmVtb3ZlIikgewogICAgCiAgICBkX2NsZWFuIDwtIGRfY2xlYW4gJT4lCiAgICAgIGdhdGhlcihjYXBhY2l0eSwgc2NvcmUsIGhhcHB5OnByaWRlKSAlPiUKICAgICAgZ3JvdXBfYnkoY2hhcmFjdGVyLCBjYXBhY2l0eSkgJT4lCiAgICAgIGZpbHRlcighc2NvcmUgJWluJSBib3hwbG90LnN0YXRzKHNjb3JlLCAyLjUpJG91dCkgJT4lCiAgICAgIHNwcmVhZChjYXBhY2l0eSwgc2NvcmUpICU+JQogICAgICBhcnJhbmdlKGNoYXJhY3Rlciwgc3ViaWQpCiAgICAKICB9CiAgCiAgIyBmaWx0ZXIgY2hhcmFjdGVycyBpZiBkZXNpcmVkCiAgaWYoaXMuZWxlbWVudCgibm9uZSIsIGNob3NlbkV4Y2x1ZGUpKSB7fSBlbHNlIHsKICAgIAogICAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgICBmaWx0ZXIoIWNoYXJhY3RlciAlaW4lIGNob3NlbkV4Y2x1ZGUpCiAgICAKICAgIH0KICAgIAogICMgZmlsdGVyIGl0ZW1zIGlmIGRlc2lyZWQKICBpZihpcy5lbGVtZW50KCJub25lIiwgY2hvc2VuRXhjbHVkZUl0ZW0pKSB7fSBlbHNlIHsKICAgIGRfY2xlYW4gPC0gZF9jbGVhbiAlPiUKICAgICAgZHBseXI6OmZpbHRlcighY2FwYWNpdHkgJWluJSBjaG9zZW5FeGNsdWRlSXRlbSkKICB9CiAgCiAgIyBkcm9wIHRyaWFscyA8MjUwIG1zCiAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgZmlsdGVyKHJ0ID49IDI1MCB8IGlzLm5hKHJ0KSkKICAKICAjIGNlbnRlciByZXNwb25zZSB2YXJpYWJsZQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIikgewogICAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgICBtdXRhdGUocmVzcG9uc2VOdW1DID0gcmVzcG9uc2VOdW0gLSA0KQogIH0gZWxzZSB7CiAgICBkX2NsZWFuIDwtIGRfY2xlYW4gJT4lCiAgICAgIG11dGF0ZShyZXNwb25zZU51bUMgPSByZXNwb25zZU51bSAtIDAuNSkKICB9CgogICAgIyByZW5hbWUgY2hhcmFjdGVyIG5hbWUgdmFyaWFibGVzCiAgaWYoImNoYXJOYW1lIiAlaW4lIG5hbWVzKGRfY2xlYW4pKSB7CiAgICBkX2NsZWFuIDwtIGRfY2xlYW4gJT4lIHJlbmFtZShjaGFyYWN0ZXIgPSBjaGFyTmFtZSkKICB9CiAgCiAgIyBjbGVhbnVwCiAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgZmlsdGVyKCFpcy5uYShzdWJpZCksICFpcy5uYShjaGFyYWN0ZXIpLCAhaXMubmEoY2FwYWNpdHkpKQogIAogICMgcmV0dXJuIGNsZWFuZWQgZGF0YXNldAogIHJldHVybihkX2NsZWFuKQp9CgojIG1ha2UgZnVuY3Rpb24gZm9yIHN0cmlwcGluZyBkYXRhZnJhbWVzIGZvciBkaW1lbnNpb24gcmVkdWNhdGlvbgptYWtlRFJERiA8LSBmdW5jdGlvbihkYXRhc291cmNlLCBjaG9zZW5Db25kaXRpb24pIHsKICAKICAjIHNldCB0YXJnZXQgZGF0YXNldAogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGQxfQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkMWJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGQxY30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAyIil7ZCA8LSBkMn0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAzIil7ZCA8LSBkM30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA0Iil7ZCA8LSBkNH0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA1Iil7ZCA8LSBkNX0KCiAgIyBmaWx0ZXIgYnkgY2hhcmFjdGVyIGlmIHNwZWNpZmllZAogIGlmKGNob3NlbkNvbmRpdGlvbiAlaW4lIGMoImJlZXRsZSIsICJyb2JvdCIpKSB7CiAgICBkIDwtIGQgJT4lIGZpbHRlcihjaGFyYWN0ZXIgPT0gY2hvc2VuQ29uZGl0aW9uKQogIH0KCiAgIyBtYWtlIHN0cmlwcGVkIGRhdGFmcmFtZSBmb3IgZGltZW5zaW9uIHJlZHVjYXRpb24gYW5hbHlzZXMKICBkX3N0cmlwIDwtIGQgJT4lCiAgICBmaWx0ZXIoIWlzLm5hKGNoYXJhY3RlciksICFpcy5uYShzdWJpZCksICFpcy5uYShjYXBhY2l0eSksIGNhcGFjaXR5ICE9ICIiKSAlPiUKICAgIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQogICAgc2VsZWN0KHN1YmlkLCBjYXBhY2l0eSwgcmVzcG9uc2VOdW0pICU+JQogICAgc3ByZWFkKGNhcGFjaXR5LCByZXNwb25zZU51bSkgJT4lCiAgICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICAgIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAic3ViaWQiKQoKICAjIHJldHVybiBzdHJpcHBlZCBkYXRhZnJhbWUKICByZXR1cm4oZF9zdHJpcCkKfQoKIyBtYWtlIGRlbW9ncmFwaGljcyBmdW5jdGlvbnMKZGVtb1NhbXBsZVNpemUgPC0gZnVuY3Rpb24oZGF0YXNvdXJjZSkgewoKICAjIHNldCB0YXJnZXQgZGF0YXNldAogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGQxfQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkMWJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGQxY30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAyIil7ZCA8LSBkMn0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAzIil7ZCA8LSBkM30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA0Iil7ZCA8LSBkNH0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA1Iil7ZCA8LSBkNX0KCiAgIyBnZXQgZGlzdGluY3Qgc3ViaWRzCiAgc2FtcGxlX3NpemUgPC0gZCAlPiUgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlcikgJT4lIGNvdW50KGNoYXJhY3RlcikgJT4lIGRhdGEuZnJhbWUoKQoKICAjIGFkZCB0b3RhbCBzYW1wbGUgc2l6ZSAgCiAgc2FtcGxlX3NpemUgPC0gcmJpbmQoc2FtcGxlX3NpemUgJT4lIG11dGF0ZShjaGFyYWN0ZXIgPSBhcy5jaGFyYWN0ZXIoY2hhcmFjdGVyKSksCiAgICAgICAgICAgICAgICAgICAgICAgYyhjaGFyYWN0ZXIgPSAiYWxsIiwgbiA9IGQgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgY291bnQoKSAlPiUgYXMubnVtZXJpYygpKSkKICAKICAjIHJldHVybiBkYXRhZnJhbWUKICByZXR1cm4oc2FtcGxlX3NpemUpCn0KZGVtb0R1cmF0aW9uIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UpIHsKCiAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxIil7ZCA8LSBkMX0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxYiIpe2QgPC0gZDFifQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFjIil7ZCA8LSBkMWN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZDJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMyIpe2QgPC0gZDN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNCIpe2QgPC0gZDR9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNSIpe2QgPC0gZDV9CgogICMgZ2V0IHNhbXBsZSBzaXplIHBlciBjaGFyYWN0ZXIKICBkdXJhdGlvbiA8LSBkICU+JQogICAgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgZHVyYXRpb24pICU+JQogICAgbXV0YXRlKGR1cmF0aW9uID0gYXMubnVtZXJpYyhkdXJhdGlvbikpICU+JQogICAgZ3JvdXBfYnkoY2hhcmFjdGVyKSAlPiUKICAgIHN1bW1hcmlzZShtaW5fZHVyYXRpb24gPSBtaW4oZHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWF4X2R1cmF0aW9uID0gbWF4KGR1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lZGlhbl9kdXJhdGlvbiA9IG1lZGlhbihkdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBtZWFuX2R1cmF0aW9uID0gbWVhbihkdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBzZF9kdXJhdGlvbiA9IHNkKGR1cmF0aW9uLCBuYS5ybSA9IFQpKQoKICAjIGFkZCB0b3RhbCBkdXJhdGlvbgogIGFsbCA8LSBkICU+JQogICAgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgZHVyYXRpb24pICU+JQogICAgbXV0YXRlKGR1cmF0aW9uID0gYXMubnVtZXJpYyhkdXJhdGlvbikpICU+JQogICAgc3VtbWFyaXNlKG1pbl9kdXJhdGlvbiA9IG1pbihkdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBtYXhfZHVyYXRpb24gPSBtYXgoZHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWVkaWFuX2R1cmF0aW9uID0gbWVkaWFuKGR1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lYW5fZHVyYXRpb24gPSBtZWFuKGR1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIHNkX2R1cmF0aW9uID0gc2QoZHVyYXRpb24sIG5hLnJtID0gVCkpICU+JQogICAgbXV0YXRlKGNoYXJhY3RlciA9ICJhbGwiKQogIAogIGR1cmF0aW9uIDwtIHJiaW5kKGR1cmF0aW9uLCBhbGwpICMgbm90IHN1cmUgd2h5IGZ1bGxfam9pbiBkb2Vzbid0IHdvcmsgICAgCgogICMgcmV0dXJuIGRhdGFmcmFtZQogIHJldHVybihkdXJhdGlvbikKfQpkZW1vQWdlIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UpIHsKCiAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxIil7ZCA8LSBkMX0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxYiIpe2QgPC0gZDFifQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFjIil7ZCA8LSBkMWN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZDJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMyIpe2QgPC0gZDN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNCIpe2QgPC0gZDR9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNSIpe2QgPC0gZDV9CgogICMgZ2V0IHNhbXBsZSBzaXplIHBlciBjaGFyYWN0ZXIKICBhZ2UgPC0gZCAlPiUKICAgIGRpc3RpbmN0KHN1YmlkLCBjaGFyYWN0ZXIsIGFnZSkgJT4lCiAgICBtdXRhdGUoYWdlID0gYXMubnVtZXJpYyhhZ2UpKSAlPiUKICAgIGdyb3VwX2J5KGNoYXJhY3RlcikgJT4lCiAgICBzdW1tYXJpc2UobWluX2FnZSA9IG1pbihhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWF4X2FnZSA9IG1heChhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWVkaWFuX2FnZSA9IG1lZGlhbihhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWVhbl9hZ2UgPSBtZWFuKGFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBzZF9hZ2UgPSBzZChhZ2UsIG5hLnJtID0gVCkpCgogICMgYWRkIHRvdGFsIGFnZQogIGFsbCA8LSBkICU+JQogICAgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgYWdlKSAlPiUKICAgIG11dGF0ZShhZ2UgPSBhcy5udW1lcmljKGFnZSkpICU+JQogICAgc3VtbWFyaXNlKG1pbl9hZ2UgPSBtaW4oYWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1heF9hZ2UgPSBtYXgoYWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lYW5fYWdlID0gbWVhbihhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgc2RfYWdlID0gc2QoYWdlLCBuYS5ybSA9IFQpKSAlPiUKICAgIG11dGF0ZShjaGFyYWN0ZXIgPSAiYWxsIikKICBhZ2UgPC0gZnVsbF9qb2luKGFnZSwgYWxsKQoKICAjIHJldHVybiBkYXRhZnJhbWUKICByZXR1cm4oYWdlKQp9CmRlbW9HZW5kZXIgPC0gZnVuY3Rpb24oZGF0YXNvdXJjZSkgewoKICAjIHNldCB0YXJnZXQgZGF0YXNldAogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGQxfQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkMWJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGQxY30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAyIil7ZCA8LSBkMn0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAzIil7ZCA8LSBkM30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA0Iil7ZCA8LSBkNH0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA1Iil7ZCA8LSBkNX0KCiAgIyBnZXQgZ2VuZGVyIHBlciBjaGFyYWN0ZXIgYW5kIG92ZXJhbGwKICBnZW5kZXIgPC0gZGF0YS5mcmFtZShhZGRtYXJnaW5zKHdpdGgoZCAlPiUgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgZ2VuZGVyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKGNoYXJhY3RlciwgZ2VuZGVyKSkpKSAlPiUKICAgIGZpbHRlcihnZW5kZXIgIT0gIlN1bSIpICU+JQogICAgcmVuYW1lKG4gPSBGcmVxKQogIAogIGdlbmRlciA8LSBnZW5kZXIgJT4lCiAgICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGlmZWxzZShjaGFyYWN0ZXIgPT0gIlN1bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsIiwgYXMuY2hhcmFjdGVyKGNoYXJhY3RlcikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJiZWV0bGUiLCAicm9ib3QiLCAiYWxsIikpKSAlPiUKICAgIGFycmFuZ2UoY2hhcmFjdGVyLCBnZW5kZXIpICU+JQogICAgc3ByZWFkKGdlbmRlciwgbikKICAKICAjIHJldHVybiBkYXRhZnJhbWUKICByZXR1cm4oZ2VuZGVyKQp9CmRlbW9SYWNlIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UpIHsKCiAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxIil7ZCA8LSBkMX0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxYiIpe2QgPC0gZDFifQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFjIil7ZCA8LSBkMWN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZDJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMyIpe2QgPC0gZDN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNCIpe2QgPC0gZDR9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNSIpe2QgPC0gZDV9CgogICMgZ2V0IHJhY2UgcGVyIGNoYXJhY3RlciBhbmQgb3ZlcmFsbAogIHJhY2UgPC0gZGF0YS5mcmFtZShhZGRtYXJnaW5zKHdpdGgoZCAlPiUgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgcmFjZV9jYXQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKGNoYXJhY3RlciwgcmFjZV9jYXQpKSkpICU+JQogICAgZmlsdGVyKHJhY2VfY2F0ICE9ICJTdW0iKSAlPiUKICAgIHJlbmFtZShuID0gRnJlcSkKCiAgICByYWNlIDwtIHJhY2UgJT4lCiAgICAgIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoaWZlbHNlKGNoYXJhY3RlciA9PSAiU3VtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsbCIsIGFzLmNoYXJhY3RlcihjaGFyYWN0ZXIpKSkpICU+JQogICAgICBhcnJhbmdlKGNoYXJhY3RlciwgcmFjZV9jYXQpICU+JQogICAgICBzcHJlYWQocmFjZV9jYXQsIG4pCiAgCiAgIyByZXR1cm4gZGF0YWZyYW1lCiAgcmV0dXJuKHJhY2UpCn0KCiMgcGxvdHRpbmcgZnVuY3Rpb25zCm1ha2VGYWNldExhYnMgPC0gZnVuY3Rpb24oZGZfcGxvdHRpbmcpIHsKICBmYWNldF9sYWJlbHMgPC0gYXJyYXkoKQogIGRmX3Bsb3R0aW5nIDwtIGRmX3Bsb3R0aW5nICU+JSBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlcikpCiAgZm9yKGkgaW4gMTpsZW5ndGgobGV2ZWxzKGRmX3Bsb3R0aW5nJGNoYXJhY3RlcikpKSB7CiAgICBkZiA8LSBkZl9wbG90dGluZyAlPiUgZmlsdGVyKGNoYXJhY3RlciA9PSBsZXZlbHMoZGZfcGxvdHRpbmckY2hhcmFjdGVyKVtpXSkgJT4lCiAgICAgIHNlbGVjdChjaGFyYWN0ZXIsIG4pICU+JSB1bmlxdWUoKQogICAgZmFjZXRfbGFiZWxzW2ldIDwtIHBhc3RlMChkZiRjaGFyYWN0ZXIsICIgKG4gPSAiLCBkZiRuLCAiKSIpCiAgfQogIG5hbWVzKGZhY2V0X2xhYmVscykgPC0gbGV2ZWxzKGRmX3Bsb3R0aW5nJGNoYXJhY3RlcikKICByZXR1cm4oZmFjZXRfbGFiZWxzKQp9CmBgYAoKYGBge3IgbW9kZWxpbmcgZGVjaXNpb25zfQojIHJlbW92ZSBvdXRsaWVycz8KY2hvc2VuT3V0bGllckhhbmRsaW5nIDwtICJrZWVwIgojIGNob3Nlbk91dGxpZXJIYW5kbGluZyA8LSAicmVtb3ZlIgoKIyBleGNsdWRlIGFueSBjb25kaXRpb25zIChjaGFyYWN0ZXJzKT8KY2hvc2VuRXhjbHVkZSA8LSAibm9uZSIKIyBjaG9zZW5FeGNsdWRlIDwtIGMoInN0YXBsZXIiLCAiY2FyIiwgImNvbXB1dGVyIikKCiMgZXhjbHVkZSBhbnkgaXRlbXMgKG1lbnRhbCBjYXBhY2l0aWVzKT8KIyBjaG9zZW5FeGNsdWRlSXRlbSA8LSAibm9uZSIKIyBjaG9zZW5FeGNsdWRlSXRlbSA8LSAiY29tcHV0YXRpb25zIgpjaG9zZW5FeGNsdWRlSXRlbSA8LSBjKCJtZXRhbCIsICJvbl9vZmYiKQoKIyBOT1RFOiBhbHdheXMgY2hvb3NlIG1pbmltYWwgcmVzaWR1YWwgKGZtID0gIm1pbnJlcyIpIGluc3RlYWQgb2YgTUwgYmVjYXVzZSBvZiBub24tbm9ybWFsaXR5CgojIGZvciBFRkFzLCB3aGF0IGtpbmQgb2YgY29ycmVsYXRpb24/CmNob3NlbkNvclR5cGUgPC0gImNvciIgIyBwZWFyc29uIGNvcnJlbGF0aW9uCiMgY2hvc2VuQ29yVHlwZSA8LSAicG9seSIgIyBwb2x5Y2hvcmljIGNvcnJlbGF0aW9uCgojIGZvciBFRkFzLCB3aGF0IGtpbmQgb2Ygcm90YXRpb24/CiMgY2hvc2VuUm90VHlwZSA8LSAidmFyaW1heCIgIyB2YXJpbWF4IHJvdGF0aW9uCmNob3NlblJvdFR5cGUgPC0gIm9ibGltaW4iICMgb2JsaW1pbiByb3RhdGlvbgojIGNob3NlblJvdFR5cGUgPC0gIm5vbmUiICMgbm8gcm90YXRpb24KCmRhdGEuZnJhbWUoImNvbmRpdGlvbnNFeGNsdWRlZCIgPSBjaG9zZW5FeGNsdWRlLAogICAgICAgICAgICJvdXRsaWVySGFuZGxpbmciID0gY2hvc2VuT3V0bGllckhhbmRsaW5nLAogICAgICAgICAgICJFRkFfY29ycmVsYXRpb24iID0gY2hvc2VuQ29yVHlwZSwKICAgICAgICAgICAiRUZBX3JvdGF0aW9uIiA9IGNob3NlblJvdFR5cGUpCmBgYAoKPHAgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiNoZWFkZXIiPmJhY2sgdG8gVE9DPC9hPjwvcD4KCiMgRGF0YSBwcmVwYXJhdGlvbgoKYGBge3IgZGF0YSB1cGxvYWR9CiMgc3R1ZHkgMSAoMjAxNi0wNy0wNiwgYWR1bHRzLCAyIGNvbmRpdGlvbnMsIDMtcG9pbnQgc2NhbGUsICJkZWNpZGUgd2hhdCB0byBkbyIgYW5kICJtYWtlIHBsYW5zIikKZF9yYXdfc3R1ZHkxIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvRGlta2lkL2RpbWtpZC9kYXRhL2FkdWx0cy91c19ydW4tMDFfMjAxNi0wNi0wNV9hbm9ueW1pemVkLmNzdiIpICU+JQogIG11dGF0ZShzdHVkeSA9ICJzdHVkeSAxIiwgYWdlX2dyb3VwID0gImFkdWx0cyIpICU+JSBzZWxlY3QoLVgpCgojIHN0dWR5IDFiICgyMDE3LTA3LTE5LCBhZHVsdHMsIDIgY29uZGl0aW9ucywgNy1wb2ludCBzY2FsZSwgImRlY2lkZSB3aGF0IHRvIGRvIiBhbmQgIm1ha2UgcGxhbnMiKQpkX3Jhd19zdHVkeTFiIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvRGlta2lkL2RpbWtpZC9kYXRhL2FkdWx0cy91c19ydW4tMDJfMjAxNi0wNy0xOV9hbm9ueW1pemVkLmNzdiIpICU+JQogIG11dGF0ZShzdHVkeSA9ICJzdHVkeSAxYiIsIGFnZV9ncm91cCA9ICJhZHVsdHMiKSAlPiUgc2VsZWN0KC1YKQoKIyBzdHVkeSAxYyAoMjAxNi0xMi0wOCwgYWR1bHRzLCAyIGNvbmRpdGlvbnMsIDMtcG9pbnQgc2NhbGUsICJoYXZlIGZyZWUgd2lsbCIgYW5kICJoYXZlIGludGVudGlvbnMiKQpkX3Jhd19zdHVkeTFjIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvRGlta2lkL2RpbWtpZC9kYXRhL2FkdWx0cy91c19ydW4tMDNfMjAxNi0xMi0wOF9hbm9ueW1pemVkLmNzdiIpICU+JQogIG11dGF0ZShzdHVkeSA9ICJzdHVkeSAxYyIsIGFnZV9ncm91cCA9ICJhZHVsdHMiKSAlPiUgc2VsZWN0KC1YKQoKIyBzdHVkeSAyIChKdW5lIC0gRGVjZW1iZXIgMjAxNiwgNy05eW8sIDIgY29uZGl0aW9ucywgMy1wb2ludC1zY2FsZSwgImRlY2lkZSB3aGF0IHRvIGRvIiBhbmQgIm1ha2UgcGxhbnMiKQpkX3Jhd19zdHVkeTIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9EaW1raWQvZGlta2lkL2RhdGEvY2hpbGRyZW4vcnVuLTAxXzIwMTctMDctMjRfYW5vbnltaXplZC5jc3YiKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAic3R1ZHkgMiIsIGFnZV9ncm91cCA9ICJjaGlsZHJlbl83OSIpICU+JSBzZWxlY3QoLVgpCgojIHN0dWR5IDMgKEphbnVhcnkgLSBKdW5lIDIwMTcsIDctOXlvLCA5IGNvbmRpdGlvbnMsIDMtcG9pbnQtc2NhbGUsICJkZWNpZGUgd2hhdCB0byBkbyIgYW5kICJtYWtlIHBsYW5zIikKZF9yYXdfc3R1ZHkzIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvRGlta2lkL2RpbWtpZC9kYXRhL2NoaWxkcmVuL3J1bi0wMl8yMDE3LTA4LTA4X2Fub255bWl6ZWQuY3N2IikgJT4lCiAgbXV0YXRlKHN0dWR5ID0gInN0dWR5IDMiLCBhZ2VfZ3JvdXAgPSAiY2hpbGRyZW5fNzkiKSAlPiUgc2VsZWN0KC1YKSAlPiUKICBtdXRhdGUoZG9iID0gcGFyc2VfZGF0ZXRpbWUoZGF0ZU9mQmlydGgsICIlbS8lZC8leSIpLAogICAgICAgICBkb3QgPSBwYXJzZV9kYXRldGltZShnc3ViKCIyMDE3IiwgIjE3IiwgZGF0ZU9mVGVzdCksICIlbS8lZC8leSIpLCAKICAgICAgICAgYWdlID0gaW50ZXJ2YWwoc3RhcnQgPSBkb2IsIGVuZCA9IGRvdCkgLyBkdXJhdGlvbihudW0gPSAxLCB1bml0cyA9ICJ5ZWFycyIpKSAlPiUKICBzZWxlY3QoLWRhdGVPZkJpcnRoLCAtZGF0ZU9mVGVzdCwgLWRvYiwgLWRvdCkKCiMgc3R1ZHkgNCAoTWF5IDIwMTcgLSBwcmVzZW50LCA0LTZ5bywgOSBjb25kaXRpb25zLCAzLXBvaW50LXNjYWxlLCAiZGVjaWRlIHdoYXQgdG8gZG8iIGFuZCAibWFrZSBwbGFucyIpCmRfcmF3X3N0dWR5NCA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL0RpbWtpZC9kaW1raWQvZGF0YS9jaGlsZHJlbi9ydW4tMDNfMjAxNy0wOC0yMV9hbm9ueW1pemVkLmNzdiIpICU+JQogIG11dGF0ZShzdHVkeSA9ICJzdHVkeSA0IiwgYWdlX2dyb3VwID0gImNoaWxkcmVuXzQ2IikgJT4lIHNlbGVjdCgtWCkgJT4lCiAgbXV0YXRlKGRvYiA9IHBhcnNlX2RhdGV0aW1lKGRhdGVPZkJpcnRoLCAiJW0vJWQvJXkiKSwKICAgICAgICAgZG90ID0gcGFyc2VfZGF0ZXRpbWUoZ3N1YigiMjAxNyIsICIxNyIsIGRhdGVPZlRlc3QpLCAiJW0vJWQvJXkiKSwgCiAgICAgICAgIGFnZSA9IGludGVydmFsKHN0YXJ0ID0gZG9iLCBlbmQgPSBkb3QpIC8gZHVyYXRpb24obnVtID0gMSwgdW5pdHMgPSAieWVhcnMiKSkgJT4lCiAgc2VsZWN0KC1kYXRlT2ZCaXJ0aCwgLWRhdGVPZlRlc3QsIC1kb2IsIC1kb3QpCgojIHN0dWR5IDUgKEZhbGwgMjAxNyAtIHByZXNlbnQsIDUuNS03LjV5byAocGx1cyksIDkgY29uZGl0aW9ucywgMy1wb2ludC1zY2FsZSwgImRlY2lkZSB3aGF0IHRvIGRvIiBhbmQgIm1ha2UgcGxhbnMiKQpkX3Jhd19zdHVkeTUgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9EaW1raWQvZGlta2lkL2RhdGEvY2hpbGRyZW4vcnVuLTA0XzIwMTctMTAtMTBfYW5vbnltaXplZC5jc3YiKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAic3R1ZHkgNSIsIGFnZV9ncm91cCA9ICJjaGlsZHJlbl81LjU3LjUiKSAlPiUgc2VsZWN0KC1YKSAlPiUKICBtdXRhdGUoZG9iID0gcGFyc2VfZGF0ZXRpbWUoZGF0ZU9mQmlydGgsICIlbS8lZC8leSIpLAogICAgICAgICBkb3QgPSBwYXJzZV9kYXRldGltZShnc3ViKCIyMDE3IiwgIjE3IiwgZGF0ZU9mVGVzdCksICIlbS8lZC8leSIpLCAKICAgICAgICAgYWdlID0gaW50ZXJ2YWwoc3RhcnQgPSBkb2IsIGVuZCA9IGRvdCkgLyBkdXJhdGlvbihudW0gPSAxLCB1bml0cyA9ICJ5ZWFycyIpKSAlPiUKICBzZWxlY3QoLWRhdGVPZkJpcnRoLCAtZGF0ZU9mVGVzdCwgLWRvYiwgLWRvdCkKYGBgCgpgYGB7ciBkYXRhIGNsZWFudXB9CiMgY2xlYW4gdXAgZGF0YXNldHMKZDEgPC0gY2xlYW51cCgic3R1ZHkgMSIsICJhZHVsdHMiKQpkMWIgPC0gY2xlYW51cCgic3R1ZHkgMSIsICJhZHVsdHMiKQpkMWMgPC0gY2xlYW51cCgic3R1ZHkgMSIsICJhZHVsdHMiKQpkMiA8LSBjbGVhbnVwKCJzdHVkeSAyIiwgImNoaWxkcmVuIikKZDMgPC0gY2xlYW51cCgic3R1ZHkgMyIsICJjaGlsZHJlbiIpCmQ0IDwtIGNsZWFudXAoInN0dWR5IDQiLCAiY2hpbGRyZW4iKQpkNSA8LSBjbGVhbnVwKCJzdHVkeSA1IiwgImNoaWxkcmVuIikKCiMgdHdlYWsgYnkgaGFuZApkMiA8LSBkMiAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZSkpICU+JQogIGZpbHRlcihhZ2UgPj0gNywgYWdlIDwgMTApICU+JQogIGZpbHRlcihjaGFyYWN0ZXIgIT0gImVsZXBoYW50IikKCmQzX291dHNpZGVhZ2UgPC0gZDMgJT4lIGZpbHRlcihhZ2UgPCA3IHwgYWdlID49IDEwKSAlPiUgZGlzdGluY3Qoc3ViaWQpCgpkMyA8LSBkMyAlPiUKICBmaWx0ZXIoIWlzLm5hKGNoYXJhY3RlciksIGNoYXJhY3RlciAhPSAiIikgJT4lCiAgZmlsdGVyKCFzdWJpZCAlaW4lIGQzX291dHNpZGVhZ2Ukc3ViaWQpICU+JQogICMgZmlsdGVyKGFnZSA+PSA3LCBhZ2UgPCAxMCkgJT4lCiAgbXV0YXRlKGV0aG5pY2l0eSA9IGdzdWIoIiBTTiIsICIiLCBldGhuaWNpdHkpKSAlPiUKICBtdXRhdGUocmFjZV9jYXQgPSBpZmVsc2UoZ3JlcGwoImJpbmciLCB0b2xvd2VyKHRlc3RpbmdTaXRlKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkEiLCAiZWFzdF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJDIiB8IGV0aG5pY2l0eSA9PSAiQ2oiLCAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkkiLCAic291dGhfYXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJNRSIsICJtaWRkbGVfZWFzdGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJBZiIsICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSA9PSAiSCIsICJoaXNwYW5pYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiICIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiLyIsIGV0aG5pY2l0eSksICJtdWx0aXJhY2lhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gImJsYWNrIG9yIGFmcmljYW4gYW1lcmljYW4iLCAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAiaGlzcGFuaWMgb3IgbGF0aW5vL2EiLCAiaGlzcGFuaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gImVhc3QgYXNpYW4iLCAiZWFzdF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gIm5hdGl2ZSBhbWVyaWNhbiwgYW1lcmljYW4gaW5kaWFuLCBvciBhbGFza2EgbmF0aXZlIiwgIm5hdGl2ZV9hbWVyaWNhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICJ3aGl0ZSIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9sb3dlcihldGhuaWNpdHkpID09ICJ3aGl0ZSwgY2F1Y2FzaWFuLCBvciBldXJvcGVhbiBhbWVyaWNhbiIsICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAic291dGggb3Igc291dGhlYXN0IGFzaWFuIiB8IHRvbG93ZXIoZXRobmljaXR5KSA9PSAic291dGggYXNpYW4iLCAic291dGhfYXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICIiIHwgaXMubmEoZXRobmljaXR5KSwgTkEsICJtdWx0aXJhY2lhbCIpKSkpKSkpKSkKCmQ0IDwtIGQ0ICU+JQogIGZpbHRlcighaXMubmEoY2hhcmFjdGVyKSwgY2hhcmFjdGVyICE9ICIiKSAlPiUKICBmaWx0ZXIoYWdlID49IDQsIGFnZSA8IDcpICU+JQogIG11dGF0ZShldGhuaWNpdHkgPSBnc3ViKCIgU04iLCAiIiwgZXRobmljaXR5KSkgJT4lCiAgbXV0YXRlKHJhY2VfY2F0ID0gaWZlbHNlKGdyZXBsKCJiaW5nIiwgdG9sb3dlcih0ZXN0aW5nU2l0ZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJBIiwgImVhc3RfYXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSA9PSAiQyIgfCBldGhuaWNpdHkgPT0gIkNqIiwgIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJJIiwgInNvdXRoX2FzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSA9PSAiTUUiLCAibWlkZGxlX2Vhc3Rlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSA9PSAiQWYiLCAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkgiLCAiaGlzcGFuaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiAiLCBldGhuaWNpdHkpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIi8iLCBldGhuaWNpdHkpLCAibXVsdGlyYWNpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICJibGFjayBvciBhZnJpY2FuIGFtZXJpY2FuIiwgImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gImhpc3BhbmljIG9yIGxhdGluby9hIiwgImhpc3BhbmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICJlYXN0IGFzaWFuIiwgImVhc3RfYXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICJuYXRpdmUgYW1lcmljYW4sIGFtZXJpY2FuIGluZGlhbiwgb3IgYWxhc2thIG5hdGl2ZSIsICJuYXRpdmVfYW1lcmljYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAid2hpdGUiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvbG93ZXIoZXRobmljaXR5KSA9PSAid2hpdGUsIGNhdWNhc2lhbiwgb3IgZXVyb3BlYW4gYW1lcmljYW4iLCAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gInNvdXRoIG9yIHNvdXRoZWFzdCBhc2lhbiIgfCB0b2xvd2VyKGV0aG5pY2l0eSkgPT0gInNvdXRoIGFzaWFuIiwgInNvdXRoX2FzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAiIiB8IGlzLm5hKGV0aG5pY2l0eSksIE5BLCAibXVsdGlyYWNpYWwiKSkpKSkpKSkpCgpkNSA8LSBkNSAlPiUKICBmaWx0ZXIoIWlzLm5hKGNoYXJhY3RlciksIGNoYXJhY3RlciAhPSAiIikgJT4lCiAgZmlsdGVyKGFnZSA+PSA1LjUsIGFnZSA8IDcuNSkgJT4lCiAgbXV0YXRlKGV0aG5pY2l0eSA9IGdzdWIoIiBTTiIsICIiLCBldGhuaWNpdHkpKSAlPiUKICBtdXRhdGUocmFjZV9jYXQgPSBpZmVsc2UoZ3JlcGwoImJpbmciLCB0b2xvd2VyKHRlc3RpbmdTaXRlKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkEiLCAiZWFzdF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJDIiB8IGV0aG5pY2l0eSA9PSAiQ2oiLCAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkkiLCAic291dGhfYXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJNRSIsICJtaWRkbGVfZWFzdGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJBZiIsICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSA9PSAiSCIsICJoaXNwYW5pYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiICIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiLyIsIGV0aG5pY2l0eSksICJtdWx0aXJhY2lhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gImJsYWNrIG9yIGFmcmljYW4gYW1lcmljYW4iLCAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAiaGlzcGFuaWMgb3IgbGF0aW5vL2EiLCAiaGlzcGFuaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gImVhc3QgYXNpYW4iLCAiZWFzdF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gIm5hdGl2ZSBhbWVyaWNhbiwgYW1lcmljYW4gaW5kaWFuLCBvciBhbGFza2EgbmF0aXZlIiwgIm5hdGl2ZV9hbWVyaWNhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICJ3aGl0ZSIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9sb3dlcihldGhuaWNpdHkpID09ICJ3aGl0ZSwgY2F1Y2FzaWFuLCBvciBldXJvcGVhbiBhbWVyaWNhbiIsICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAic291dGggb3Igc291dGhlYXN0IGFzaWFuIiB8IHRvbG93ZXIoZXRobmljaXR5KSA9PSAic291dGggYXNpYW4iLCAic291dGhfYXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICIiIHwgaXMubmEoZXRobmljaXR5KSwgTkEsICJtdWx0aXJhY2lhbCIpKSkpKSkpKSkKYGBgCgpgYGB7ciBkYXRhZnJhbWVzIGZvciBkaW1lbnNpb24gcmVkdWNhdGlvbn0KIyBtYWtlIGRhdGFmcmFtZXMgZm9yIHMxCiMgZDFfYmVldGxlIDwtIG1ha2VEUkRGKCJzdHVkeSAxIiwgImJlZXRsZSIpCiMgZDFfcm9ib3QgPC0gbWFrZURSREYoInN0dWR5IDEiLCAicm9ib3QiKQpkMV9hbGwgPC0gbWFrZURSREYoInN0dWR5IDEiLCAiYWxsIikKCiMgbWFrZSBkYXRhZnJhbWVzIGZvciBmb2xsb3ctdXAgc3R1ZGllcyB0byBzMQpkMWJfYWxsIDwtIG1ha2VEUkRGKCJzdHVkeSAxYiIsICJhbGwiKQpkMWNfYWxsIDwtIG1ha2VEUkRGKCJzdHVkeSAxYyIsICJhbGwiKQoKIyBtYWtlIGRhdGFmcmFtZXMgZm9yIHN0dWR5IDIKIyBkMl9iZWV0bGUgPC0gbWFrZURSREYoInN0dWR5IDIiLCAiYmVldGxlIikKIyBkMl9yb2JvdCA8LSBtYWtlRFJERigic3R1ZHkgMiIsICJyb2JvdCIpCmQyX2FsbCA8LSBtYWtlRFJERigic3R1ZHkgMiIsICJhbGwiKQoKIyBtYWtlIGRhdGFmcmFtZXMgZm9yIHN0dWR5IDMKIyBkM19iZWV0bGUgPC0gbWFrZURSREYoInN0dWR5IDMiLCAiYmVldGxlIikKIyBkM19yb2JvdCA8LSBtYWtlRFJERigic3R1ZHkgMyIsICJyb2JvdCIpCmQzX2FsbCA8LSBtYWtlRFJERigic3R1ZHkgMyIsICJhbGwiKQoKIyBtYWtlIGRhdGFmcmFtZXMgZm9yIHN0dWR5IDQKZDRfYWxsIDwtIG1ha2VEUkRGKCJzdHVkeSA0IiwgImFsbCIpCmBgYAoKPHAgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiNoZWFkZXIiPmJhY2sgdG8gVE9DPC9hPjwvcD4KCiMgQW5hbHlzaXMgcGxhbgoKRm9yIGFsbCBzdHVkaWVzIHdlIGNvbmR1Y3QgZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2VzIHVzaW5nIFBlYXJzb24gY29ycmVsYXRpb25zIHRvIGZpbmQgbWluaW11bSByZXNpZHVhbCBzb2x1dGlvbnMuIAoKRm9yIGVhY2ggc3R1ZHksIHdlIGZpcnN0IGV4YW1pbmUgbWF4aW1hbCB1bnJvdGF0ZWQgYW5kIHJvdGF0ZWQgc29sdXRpb25zLiBUbyBkZXRlcm1pbmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZhY3RvcnMgdG8gZXh0cmFjdCwgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcnVsZSBvZiB0aHVtYjogV2l0aCAkcCQgb2JzZXJ2YXRpb25zIHBlciBwYXJ0aWNpcGFudCwgd2UgY2FuIGV4dHJhY3QgYSBtYXhpbXVtIG9mICRrJCBmYWN0b3JzLCB3aGVyZSAkKHAtaykqMiA+IHArayQsIGkuZS4sICRrIDwgcC8zJC4gVGh1cywgd2l0aCA0MCBtZW50YWwgY2FwYWNpdHkgaXRlbXMsIHdlIGNhbiBleHRyYWN0IGEgbWF4aW11bSBvZiAxMyBmYWN0b3JzLgoKVG8gZGV0ZXJtaW5lIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmVzZXQgcmV0ZW50aW9uIGNyaXRlcmlhLCBjb25zaWRlcmluZyB0aGUgdW5yb3RhdGVkIG1heGltYWwgc29sdXRpb24gKHVubGVzcyBvdGhlcndpc2Ugbm90ZWQpOgoKICAtIEVhY2ggZmFjdG9yIG11c3QgaGF2ZSBhbiBlaWdlbnZhbHVlID4xLjAuCiAgLSBFYWNoIGZhY3RvciBtdXN0IGluZGl2aWR1YWxseSBhY2NvdW50IGZvciA+NSUgb2YgdGhlIHRvdGFsIHZhcmlhbmNlIGluIHRoZSBtYXhpbWFsIG1vZGVsLgogIC0gQWZ0ZXIgcm90YXRpb24sIGVhY2ggZmFjdG9yIG11c3QgYmUgdGhlIGRvbWluYW50IGZhY3RvciAoaS5lLiwgdGhlIGZhY3RvciB3aXRoIHRoZSBoaWdoZXN0IGZhY3RvciBsb2FkaW5nKSBmb3Ig4omlMSBtZW50YWwgY2FwYWNpdHkgaXRlbS4KCldlIHRoZW4gZXhhbWluZSBhbmQgaW50ZXJwcmV0IHZhcmltYXgtcm90YXRlZCBzb2x1dGlvbnMsIGV4dHJhY3Rpbmcgb25seSB0aGUgbnVtYmVyIG9mIGZhY3RvcnMgdGhhdCBtZWV0IHRoZXNlIGNyaXRlcmlhLgoKIyBTdHVkeSAxIChDb2dTY2kgMjAxNykKClN0dWR5IGluZm9ybWF0aW9uOgoKKiBEZXNpZ246IDIgY29uZGl0aW9ucyAoYmVldGxlLCByb2JvdCksIDMtcG9pbnQgcmVzcG9uc2Ugc2NhbGUsICJkZWNpZGUgd2hhdCB0byBkbyIgYW5kICJoYXZlIGludGVudGlvbnMiCiogUG9wdWxhdGlvbjogYWR1bHRzCiogRGF0ZSBjb25kdWN0ZWQ6IDIwMTYtMDctMDYgKE1UdXJrKQoKIyMgRGVtb2dyYXBoaWNzCgpgYGB7ciBzMSBkZW1vZ3JhcGhpY3N9CiMgbWFrZSBkZW1vZ3JhcGhpY3MgdGFibGVzCmRlbW9TYW1wbGVTaXplKCJzdHVkeSAxIikKZGVtb0R1cmF0aW9uKCJzdHVkeSAxIikKZGVtb0FnZSgic3R1ZHkgMSIpCmRlbW9HZW5kZXIoInN0dWR5IDEiKQpkZW1vUmFjZSgic3R1ZHkgMSIpCmBgYAoKPHAgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiNoZWFkZXIiPmJhY2sgdG8gVE9DPC9hPjwvcD4KCiMjIEV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcwoKIyMjIFN0ZXAgMTogUnVuIG1heGltYWwgRUZBICh3aXRob3V0IGFuZCB3aXRoIHJvdGF0aW9uKQoKYGBge3IgczEgYWxsIG5vIHJvdGF0aW9ufQojICMgYWx0ZXJuYXRpdmUgbWV0aG9kcyBvZiBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzCiMgZmEucGFyYWxsZWwoZDFfYWxsKQojIFZTUyhkMV9hbGwpCgojIHJ1biBFRkEgd2l0aG91dCByb3RhdGlvbiB3aXRoIE4gZmFjdG9ycwplZmFfZDFfYWxsX3Vucm90YXRlZCA8LSBmYShkMV9hbGwsIDEzLCByb3RhdGUgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCnByaW50KGVmYV9kMV9hbGxfdW5yb3RhdGVkKQoKIyBleGFtaW5lIGVpZ2VudmFsdWVzIGFuZCB2YXJpYW5jZSBleHBsYWluZWQKZWZhX2QxX2FsbF91bnJvdGF0ZWRfZWlnZW52YWx1ZXMgPC0gcHJpbnQoZWZhX2QxX2FsbF91bnJvdGF0ZWQpJFZhY2NvdW50ZWQgJT4lCiAgdCgpICU+JQogIGRhdGEuZnJhbWUoKQoKIyBjb3VudCBmYWN0b3JzIHdpdGggZWlnZW52YWx1ZXMgPiAxIGFuZCB2YXJpYW5jZSBleHBsYWluZWQgPiA1JQplZmFfZDFfYWxsX3Vucm90YXRlZF9uZmFjdG9ycyA8LSBlZmFfZDFfYWxsX3Vucm90YXRlZF9laWdlbnZhbHVlcyAlPiUKICBmaWx0ZXIoU1MubG9hZGluZ3MgPiAxLCBQcm9wb3J0aW9uLkV4cGxhaW5lZCA+IDAuMDUpICU+JQogIGNvdW50KCkgJT4lCiAgYXMubnVtZXJpYygpCmVmYV9kMV9hbGxfdW5yb3RhdGVkX25mYWN0b3JzCmBgYAoKYGBge3IgczEgYWxsIHJvdGF0aW9ufQplZmFfZDFfYWxsX3JvdGF0ZWRfbWF4IDwtIGZhKGQxX2FsbCwgMTMsIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCgplZmFfZDFfYWxsX3JvdGF0ZWQgPC0gZmEoZDFfYWxsLCBlZmFfZDFfYWxsX3Vucm90YXRlZF9uZmFjdG9ycywgcm90YXRlID0gY2hvc2VuUm90VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKCiMgY2hlY2sgdGhhdCBlYWNoIG9mIHRoZXNlIGZhY3RvcnMgaXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3IgYXQgbGVhc3Qgb25lIG1lbnRhbCBjYXBhY2l0eSBpdGVtCmVmYV9kMV9hbGxfcm90YXRlZF9sb2FkaW5ncyA8LSBmYS5zb3J0KGxvYWRpbmdzKGVmYV9kMV9hbGxfcm90YXRlZClbXSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogIG11dGF0ZShsb2FkaW5nX2FicyA9IGFicyhsb2FkaW5nKSkgJT4lCiAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogIHRvcF9uKDEsIGxvYWRpbmdfYWJzKSAlPiUKICB1bmdyb3VwKCkKZWZhX2QxX2FsbF9yb3RhdGVkX2xvYWRpbmdzCgojIGRyb3AgYW55IGZhY3RvcnMgd2hlcmUgbiA8IDEKZWZhX2QxX2FsbF9yb3RhdGVkX2xvYWRpbmdzICU+JSAKICBjb3VudChmYWN0b3IpICU+JSAKICBmaWx0ZXIobiA+IDApCgojIHNldCBudW1iZXIgb2YgZmFjdG9ycyB0byBleHRyYWN0Cm5mYWN0b3JzX2QxX2FsbCA8LSBlZmFfZDFfYWxsX3JvdGF0ZWRfbG9hZGluZ3MgJT4lIAogIGNvdW50KGZhY3RvcikgJT4lIAogIGZpbHRlcihuID4gMCkgJT4lCiAgbnJvdygpCm5mYWN0b3JzX2QxX2FsbApgYGAKCiMjIyBTdGVwIDI6IFJ1biBFRkEgd2l0aCByb3RhdGlvbgoKYGBge3IgczEgYWxsIHJvdGF0aW9uMn0KIyBydW4gRUZBIHdpdGggcm90YXRpb24gd2l0aCBOIGZhY3RvcnMKZWZhX2QxX2FsbF9yb3RhdGVkTiA8LSBmYShkMV9hbGwsIG5mYWN0b3JzX2QxX2FsbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlID0gY2hvc2VuUm90VHlwZSwgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKcHJpbnQoZWZhX2QxX2FsbF9yb3RhdGVkTikKCiMgZ2V0IGxvYWRpbmdzIGZvciBlYWNoIGZhY3RvcgplZmFfZDFfYWxsX3JvdGF0ZWROX2xvYWRpbmdzIDwtIGxvYWRpbmdzKGVmYV9kMV9hbGxfcm90YXRlZE4pW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4odmFyID0gImNhcGFjaXR5IikKYGBgCgo8cCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+PGEgaHJlZj0iI2hlYWRlciI+YmFjayB0byBUT0M8L2E+PC9wPgoKIyMjIyBGYWN0b3IgbG9hZGluZ3MgdGFibGUKCmBgYHtyIHMxIGxvYWRpbmdzIHRhYmxlfQpkYXRhLmZyYW1lKGxvYWRpbmdzKGZhLnNvcnQoZWZhX2QxX2FsbF9yb3RhdGVkTikpW10pICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiTSIpKSwgZnVucyhyb3VuZDIpKQpgYGAKCiMgU3R1ZHkgMiAoQ29nU2NpIDIwMTcpCgpTdHVkeSBpbmZvcm1hdGlvbjoKCiogRGVzaWduOiAyIGNvbmRpdGlvbnMgKGJlZXRsZSwgcm9ib3QpLCAzLXBvaW50IHJlc3BvbnNlIHNjYWxlLCAiZGVjaWRlIHdoYXQgdG8gZG8iIGFuZCAiaGF2ZSBpbnRlbnRpb25zIgoqIFBvcHVsYXRpb246IDctOXlvIGNoaWxkcmVuCiogRGF0ZSBjb25kdWN0ZWQ6IEp1bmUgLSBEZWNlbWJlciAyMDE2CgojIyBEZW1vZ3JhcGhpY3MKCmBgYHtyIHMyIGRlbW9ncmFwaGljc30KIyBtYWtlIGRlbW9ncmFwaGljcyB0YWJsZXMKZGVtb1NhbXBsZVNpemUoInN0dWR5IDIiKQojIGRlbW9EdXJhdGlvbigic3R1ZHkgMiIpCmRlbW9BZ2UoInN0dWR5IDIiKQpkZW1vR2VuZGVyKCJzdHVkeSAyIikKIyBkZW1vUmFjZSgic3R1ZHkgMiIpCmBgYAoKPHAgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiNoZWFkZXIiPmJhY2sgdG8gVE9DPC9hPjwvcD4KCiMjIEV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcwoKIyMjIFN0ZXAgMTogUnVuIG1heGltYWwgRUZBICh3aXRob3V0IGFuZCB3aXRoIHJvdGF0aW9uKQoKYGBge3IgczIgYWxsIG5vIHJvdGF0aW9ufQojICMgYWx0ZXJuYXRpdmUgbWV0aG9kcyBvZiBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzCiMgZmEucGFyYWxsZWwoZDJfYWxsKQojIFZTUyhkMl9hbGwpCgojIHJ1biBFRkEgd2l0aG91dCByb3RhdGlvbiB3aXRoIE4gZmFjdG9ycwplZmFfZDJfYWxsX3Vucm90YXRlZCA8LSBmYShkMl9hbGwsIDEzLCByb3RhdGUgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCnByaW50KGVmYV9kMl9hbGxfdW5yb3RhdGVkKQoKIyBleGFtaW5lIGVpZ2VudmFsdWVzIGFuZCB2YXJpYW5jZSBleHBsYWluZWQKZWZhX2QyX2FsbF91bnJvdGF0ZWRfZWlnZW52YWx1ZXMgPC0gcHJpbnQoZWZhX2QyX2FsbF91bnJvdGF0ZWQpJFZhY2NvdW50ZWQgJT4lCiAgdCgpICU+JQogIGRhdGEuZnJhbWUoKQoKIyBjb3VudCBmYWN0b3JzIHdpdGggZWlnZW52YWx1ZXMgPiAxIGFuZCB2YXJpYW5jZSBleHBsYWluZWQgPiA1JQplZmFfZDJfYWxsX3Vucm90YXRlZF9uZmFjdG9ycyA8LSBlZmFfZDJfYWxsX3Vucm90YXRlZF9laWdlbnZhbHVlcyAlPiUKICBmaWx0ZXIoU1MubG9hZGluZ3MgPiAxLCBQcm9wb3J0aW9uLkV4cGxhaW5lZCA+IDAuMDUpICU+JQogIGNvdW50KCkgJT4lCiAgYXMubnVtZXJpYygpCmVmYV9kMl9hbGxfdW5yb3RhdGVkX25mYWN0b3JzCmBgYAoKYGBge3IgczIgYWxsIHJvdGF0aW9ufQplZmFfZDJfYWxsX3JvdGF0ZWRfbWF4IDwtIGZhKGQyX2FsbCwgMTMsIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCgplZmFfZDJfYWxsX3JvdGF0ZWQgPC0gZmEoZDJfYWxsLCBlZmFfZDJfYWxsX3Vucm90YXRlZF9uZmFjdG9ycywgcm90YXRlID0gY2hvc2VuUm90VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKCiMgY2hlY2sgdGhhdCBlYWNoIG9mIHRoZXNlIGZhY3RvcnMgaXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3IgYXQgbGVhc3Qgb25lIG1lbnRhbCBjYXBhY2l0eSBpdGVtCmVmYV9kMl9hbGxfcm90YXRlZF9sb2FkaW5ncyA8LSBmYS5zb3J0KGxvYWRpbmdzKGVmYV9kMl9hbGxfcm90YXRlZClbXSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogIG11dGF0ZShsb2FkaW5nX2FicyA9IGFicyhsb2FkaW5nKSkgJT4lCiAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogIHRvcF9uKDEsIGxvYWRpbmdfYWJzKSAlPiUKICB1bmdyb3VwKCkKZWZhX2QyX2FsbF9yb3RhdGVkX2xvYWRpbmdzCgojIGRyb3AgYW55IGZhY3RvcnMgd2hlcmUgbiA8IDEKZWZhX2QyX2FsbF9yb3RhdGVkX2xvYWRpbmdzICU+JSAKICBjb3VudChmYWN0b3IpICU+JSAKICBmaWx0ZXIobiA+IDApCgojIHNldCBudW1iZXIgb2YgZmFjdG9ycyB0byBleHRyYWN0Cm5mYWN0b3JzX2QyX2FsbCA8LSBlZmFfZDJfYWxsX3JvdGF0ZWRfbG9hZGluZ3MgJT4lIAogIGNvdW50KGZhY3RvcikgJT4lIAogIGZpbHRlcihuID4gMCkgJT4lCiAgbnJvdygpCm5mYWN0b3JzX2QyX2FsbApgYGAKCiMjIyBTdGVwIDI6IFJ1biBFRkEgd2l0aCByb3RhdGlvbgoKYGBge3IgczIgYWxsIHJvdGF0aW9uIDJ9CiMgcnVuIEVGQSB3aXRoIHJvdGF0aW9uIHdpdGggTiBmYWN0b3JzCmVmYV9kMl9hbGxfcm90YXRlZE4gPC0gZmEoZDJfYWxsLCBuZmFjdG9yc19kMl9hbGwsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCnByaW50KGVmYV9kMl9hbGxfcm90YXRlZE4pCgojIGdldCBsb2FkaW5ncyBmb3IgZWFjaCBmYWN0b3IKZWZhX2QyX2FsbF9yb3RhdGVkTl9sb2FkaW5ncyA8LSBsb2FkaW5ncyhlZmFfZDJfYWxsX3JvdGF0ZWROKVtdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpCmBgYAoKPHAgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiNoZWFkZXIiPmJhY2sgdG8gVE9DPC9hPjwvcD4KCiMjIyMgRmFjdG9yIGxvYWRpbmdzIHRhYmxlCgpgYGB7ciBzMiBsb2FkaW5ncyB0YWJsZX0KZGF0YS5mcmFtZShsb2FkaW5ncyhmYS5zb3J0KGVmYV9kMl9hbGxfcm90YXRlZE4pKVtdKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIk0iKSksIGZ1bnMocm91bmQyKSkKYGBgCgojIFN0dWR5IDMgKENvZ1NjaSAyMDE4KQoKU3R1ZHkgaW5mb3JtYXRpb246CgoqIERlc2lnbjogNyBjb25kaXRpb25zIChiZWV0bGUsIHJvYm90LCAuLi4pICsgMiBmb2xsb3ctdXAgY29uZGl0aW9ucywgMy1wb2ludCByZXNwb25zZSBzY2FsZSwgImRlY2lkZSB3aGF0IHRvIGRvIiBhbmQgImhhdmUgaW50ZW50aW9ucyIKKiBQb3B1bGF0aW9uOiA3LTl5byBjaGlsZHJlbgoqIERhdGUgY29uZHVjdGVkOiBKYW51YXJ5IC0gSnVuZSAyMDE3CgojIyBEZW1vZ3JhcGhpY3MKCmBgYHtyIHMzIGRlbW9ncmFwaGljc30KIyBtYWtlIGRlbW9ncmFwaGljcyB0YWJsZXMKZGVtb1NhbXBsZVNpemUoInN0dWR5IDMiKQojIGRlbW9EdXJhdGlvbigic3R1ZHkgMyIpCmRlbW9BZ2UoInN0dWR5IDMiKQojIGRlbW9HZW5kZXIoInN0dWR5IDMiKQojIGRlbW9SYWNlKCJzdHVkeSAzIikKYGBgCgo8cCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+PGEgaHJlZj0iI2hlYWRlciI+YmFjayB0byBUT0M8L2E+PC9wPgoKIyMgRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzCgojIyMgU3RlcCAxOiBSdW4gbWF4aW1hbCBFRkEgKHdpdGhvdXQgYW5kIHdpdGggcm90YXRpb24pCgpgYGB7ciBzMyBhbGwgbm8gcm90YXRpb259CiMgIyBhbHRlcm5hdGl2ZSBtZXRob2RzIG9mIGRldGVybWluaW5nIGhvdyBtYW55IGZhY3RvcnMKIyBmYS5wYXJhbGxlbChkM19hbGwpCiMgVlNTKGQzX2FsbCkKCiMgcnVuIEVGQSB3aXRob3V0IHJvdGF0aW9uIHdpdGggTiBmYWN0b3JzCmVmYV9kM19hbGxfdW5yb3RhdGVkIDwtIGZhKGQzX2FsbCwgNiwgcm90YXRlID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3IgPSBjaG9zZW5Db3JUeXBlLCBmbSA9ICJtaW5yZXMiKQpwcmludChlZmFfZDNfYWxsX3Vucm90YXRlZCkKCiMgZXhhbWluZSBlaWdlbnZhbHVlcyBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkCmVmYV9kM19hbGxfdW5yb3RhdGVkX2VpZ2VudmFsdWVzIDwtIHByaW50KGVmYV9kM19hbGxfdW5yb3RhdGVkKSRWYWNjb3VudGVkICU+JQogIHQoKSAlPiUKICBkYXRhLmZyYW1lKCkKCiMgY291bnQgZmFjdG9ycyB3aXRoIGVpZ2VudmFsdWVzID4gMSBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkID4gNSUKZWZhX2QzX2FsbF91bnJvdGF0ZWRfbmZhY3RvcnMgPC0gZWZhX2QzX2FsbF91bnJvdGF0ZWRfZWlnZW52YWx1ZXMgJT4lCiAgZmlsdGVyKFNTLmxvYWRpbmdzID4gMSwgUHJvcG9ydGlvbi5FeHBsYWluZWQgPiAwLjA1KSAlPiUKICBjb3VudCgpICU+JQogIGFzLm51bWVyaWMoKQplZmFfZDNfYWxsX3Vucm90YXRlZF9uZmFjdG9ycwpgYGAKCmBgYHtyIHMzIGFsbCByb3RhdGlvbn0KZWZhX2QzX2FsbF9yb3RhdGVkX21heCA8LSBmYShkM19hbGwsIDYsIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCgplZmFfZDNfYWxsX3JvdGF0ZWQgPC0gZmEoZDNfYWxsLCBlZmFfZDNfYWxsX3Vucm90YXRlZF9uZmFjdG9ycywgcm90YXRlID0gY2hvc2VuUm90VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKCiMgY2hlY2sgdGhhdCBlYWNoIG9mIHRoZXNlIGZhY3RvcnMgaXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3IgYXQgbGVhc3Qgb25lIG1lbnRhbCBjYXBhY2l0eSBpdGVtCmVmYV9kM19hbGxfcm90YXRlZF9sb2FkaW5ncyA8LSBmYS5zb3J0KGxvYWRpbmdzKGVmYV9kM19hbGxfcm90YXRlZClbXSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogIG11dGF0ZShsb2FkaW5nX2FicyA9IGFicyhsb2FkaW5nKSkgJT4lCiAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogIHRvcF9uKDEsIGxvYWRpbmdfYWJzKSAlPiUKICB1bmdyb3VwKCkKZWZhX2QzX2FsbF9yb3RhdGVkX2xvYWRpbmdzCgojIGRyb3AgYW55IGZhY3RvcnMgd2hlcmUgbiA8IDEKZWZhX2QzX2FsbF9yb3RhdGVkX2xvYWRpbmdzICU+JSAKICBjb3VudChmYWN0b3IpICU+JSAKICBmaWx0ZXIobiA+IDApCgojIHNldCBudW1iZXIgb2YgZmFjdG9ycyB0byBleHRyYWN0Cm5mYWN0b3JzX2QzX2FsbCA8LSBlZmFfZDNfYWxsX3JvdGF0ZWRfbG9hZGluZ3MgJT4lIAogIGNvdW50KGZhY3RvcikgJT4lIAogIGZpbHRlcihuID4gMCkgJT4lCiAgbnJvdygpCm5mYWN0b3JzX2QzX2FsbApgYGAKCiMjIyBTdGVwIDI6IFJ1biBFRkEgd2l0aCByb3RhdGlvbgoKYGBge3IgczMgYWxsIHJvdGF0aW9uIDJ9CiMgcnVuIEVGQSB3aXRoIHJvdGF0aW9uIHdpdGggTiBmYWN0b3JzCmVmYV9kM19hbGxfcm90YXRlZE4gPC0gZmEoZDNfYWxsLCBuZmFjdG9yc19kM19hbGwsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsIGNvciA9IGNob3NlbkNvclR5cGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gIm1pbnJlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIG4uaXRlciA9IDUwMDApICMgbWFueSBpdGVyIGZvciBib290c3RyYXBwZWQgQ0lzCnByaW50KGVmYV9kM19hbGxfcm90YXRlZE4pCgojIGdldCBsb2FkaW5ncyBmb3IgZWFjaCBmYWN0b3IKZWZhX2QzX2FsbF9yb3RhdGVkTl9sb2FkaW5ncyA8LSBsb2FkaW5ncyhlZmFfZDNfYWxsX3JvdGF0ZWROKVtdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpCmBgYAoKPHAgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiNoZWFkZXIiPmJhY2sgdG8gVE9DPC9hPjwvcD4KCiMjIyMgRmFjdG9yIGxvYWRpbmdzIHRhYmxlCgpgYGB7ciBzMyBsb2FkaW5ncyB0YWJsZX0KZGF0YS5mcmFtZShsb2FkaW5ncyhmYS5zb3J0KGVmYV9kM19hbGxfcm90YXRlZE4pKVtdKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIk0iKSksIGZ1bnMocm91bmQyKSkKYGBgCgojIyMgU3Vic2NhbGVzCgojIyMjIFJlbGlhYmlsaXR5IChhbmQgaW50ZXJjb3JyZWxhdGlvbnMgLSBzZWUgYWxwaGEpCgpgYGB7ciBzMyBzdWJzY2FsZSByZWxpYWJpbGl0eX0KIyBDcm9uYmFjaCdzIGFscGhhIChzdWJzY2FsZXMpCmtleXMubGlzdCA8LSBsaXN0KEhFQVJUID0gYygicHJpZGUiLCAiZGVwcmVzc2VkIiwgImRpc3Jlc3BlY3RlZCIsICJndWlsdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZW1iYXJyYXNzZWQiLCAiaGFwcHkiLCAibG92ZSIpLAogICAgICAgICAgICAgICAgICBCT0RZID0gYygiaHVuZ3J5IiwgIm9kb3JzIiwgImZlYXIiLCAicGFpbiIsICJ0aXJlZCIsICJhbmdyeSIsICJuYXVzZWF0ZWQiKSwKICAgICAgICAgICAgICAgICAgTUlORCA9IGMoInJlYXNvbmluZyIsICJjaG9pY2VzIiwgInJlbWVtYmVyaW5nIiwgInRlbXBlcmF0dXJlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zY2lvdXMiLCAiZGVwdGgiKSkgCnNjb3JlcyA8LSBzY29yZUl0ZW1zKGtleXMubGlzdCwgZDNfYWxsLCBtaW4gPSAwLCBtYXggPSAxKSAgIyBvciBqdXN0IHVzZSB0aGUga2V5cy5saXQKIyBzdW1tYXJ5KHNjb3JlcykKc2NvcmVzCgojIG9tZWdhCm9tZWdhKGQzX2FsbCwgcGxvdCA9IEYpCmBgYAoKIyBTdHVkeSA0IChDb2dTY2kgMjAxOCkKClN0dWR5IGluZm9ybWF0aW9uOgoKKiBEZXNpZ246IDcgY29uZGl0aW9ucyAoYmVldGxlLCByb2JvdCwgLi4uKSArIDIgZm9sbG93LXVwIGNvbmRpdGlvbnMgKGRvbGwsIHRlZGR5IGJlYXIpLCAzLXBvaW50IHJlc3BvbnNlIHNjYWxlLCAiZGVjaWRlIHdoYXQgdG8gZG8iIGFuZCAiaGF2ZSBpbnRlbnRpb25zIgoqIFBvcHVsYXRpb246IDQtNnlvIGNoaWxkcmVuCiogRGF0ZSBjb25kdWN0ZWQ6IE1hcmNoIDIwMTcgLSBwcmVzZW50CgojIyBEZW1vZ3JhcGhpY3MKCmBgYHtyIHM0IGRlbW9ncmFwaGljc30KIyBtYWtlIGRlbW9ncmFwaGljcyB0YWJsZXMKZGVtb1NhbXBsZVNpemUoInN0dWR5IDQiKQojIGRlbW9EdXJhdGlvbigic3R1ZHkgNCIpCmRlbW9BZ2UoInN0dWR5IDQiKQojIGRlbW9HZW5kZXIoInN0dWR5IDQiKQpkZW1vUmFjZSgic3R1ZHkgNCIpCmBgYAoKPHAgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiNoZWFkZXIiPmJhY2sgdG8gVE9DPC9hPjwvcD4KCiMjIEV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcwoKIyMjIFN0ZXAgMTogUnVuIG1heGltYWwgRUZBICh3aXRob3V0IGFuZCB3aXRoIHJvdGF0aW9uKQoKYGBge3IgczQgYWxsIG5vIHJvdGF0aW9ufQojICMgYWx0ZXJuYXRpdmUgbWV0aG9kcyBvZiBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzCiMgZmEucGFyYWxsZWwoZDRfYWxsKQojIFZTUyhkNF9hbGwpCgojIHJ1biBFRkEgd2l0aG91dCByb3RhdGlvbiB3aXRoIE4gZmFjdG9ycwplZmFfZDRfYWxsX3Vucm90YXRlZCA8LSBmYShkNF9hbGwsIDYsIHJvdGF0ZSA9ICJub25lIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCnByaW50KGVmYV9kNF9hbGxfdW5yb3RhdGVkKQoKIyBleGFtaW5lIGVpZ2VudmFsdWVzIGFuZCB2YXJpYW5jZSBleHBsYWluZWQKZWZhX2Q0X2FsbF91bnJvdGF0ZWRfZWlnZW52YWx1ZXMgPC0gcHJpbnQoZWZhX2Q0X2FsbF91bnJvdGF0ZWQpJFZhY2NvdW50ZWQgJT4lCiAgdCgpICU+JQogIGRhdGEuZnJhbWUoKQoKIyBjb3VudCBmYWN0b3JzIHdpdGggZWlnZW52YWx1ZXMgPiAxIGFuZCB2YXJpYW5jZSBleHBsYWluZWQgPiA1JQplZmFfZDRfYWxsX3Vucm90YXRlZF9uZmFjdG9ycyA8LSBlZmFfZDRfYWxsX3Vucm90YXRlZF9laWdlbnZhbHVlcyAlPiUKICBmaWx0ZXIoU1MubG9hZGluZ3MgPiAxLCBQcm9wb3J0aW9uLkV4cGxhaW5lZCA+IDAuMDUpICU+JQogIGNvdW50KCkgJT4lCiAgYXMubnVtZXJpYygpCmVmYV9kNF9hbGxfdW5yb3RhdGVkX25mYWN0b3JzCmBgYAoKYGBge3IgczQgYWxsIHJvdGF0aW9ufQplZmFfZDRfYWxsX3JvdGF0ZWRfbWF4IDwtIGZhKGQ0X2FsbCwgNiwgcm90YXRlID0gY2hvc2VuUm90VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKCmVmYV9kNF9hbGxfcm90YXRlZCA8LSBmYShkNF9hbGwsIGVmYV9kNF9hbGxfdW5yb3RhdGVkX25mYWN0b3JzLCByb3RhdGUgPSBjaG9zZW5Sb3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3IgPSBjaG9zZW5Db3JUeXBlLCBmbSA9ICJtaW5yZXMiKQoKIyBjaGVjayB0aGF0IGVhY2ggb2YgdGhlc2UgZmFjdG9ycyBpcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBhdCBsZWFzdCBvbmUgbWVudGFsIGNhcGFjaXR5IGl0ZW0KZWZhX2Q0X2FsbF9yb3RhdGVkX2xvYWRpbmdzIDwtIGZhLnNvcnQobG9hZGluZ3MoZWZhX2Q0X2FsbF9yb3RhdGVkKVtdKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJjYXBhY2l0eSIpICU+JQogIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgbXV0YXRlKGxvYWRpbmdfYWJzID0gYWJzKGxvYWRpbmcpKSAlPiUKICBncm91cF9ieShjYXBhY2l0eSkgJT4lCiAgdG9wX24oMSwgbG9hZGluZ19hYnMpICU+JQogIHVuZ3JvdXAoKQplZmFfZDRfYWxsX3JvdGF0ZWRfbG9hZGluZ3MKCiMgZHJvcCBhbnkgZmFjdG9ycyB3aGVyZSBuIDwgMQplZmFfZDRfYWxsX3JvdGF0ZWRfbG9hZGluZ3MgJT4lIAogIGNvdW50KGZhY3RvcikgJT4lIAogIGZpbHRlcihuID4gMCkKCiMgc2V0IG51bWJlciBvZiBmYWN0b3JzIHRvIGV4dHJhY3QKbmZhY3RvcnNfZDRfYWxsIDwtIGVmYV9kNF9hbGxfcm90YXRlZF9sb2FkaW5ncyAlPiUgCiAgY291bnQoZmFjdG9yKSAlPiUgCiAgZmlsdGVyKG4gPiAwKSAlPiUKICBucm93KCkKbmZhY3RvcnNfZDRfYWxsCmBgYAoKIyMjIFN0ZXAgMjogUnVuIEVGQSB3aXRoIHJvdGF0aW9uCgpgYGB7ciBzNCBhbGwgcm90YXRpb24gMn0KIyBydW4gRUZBIHdpdGggcm90YXRpb24gd2l0aCBOIGZhY3RvcnMKZWZhX2Q0X2FsbF9yb3RhdGVkTiA8LSBmYShkNF9hbGwsIG5mYWN0b3JzX2Q0X2FsbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlID0gY2hvc2VuUm90VHlwZSwgY29yID0gY2hvc2VuQ29yVHlwZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSAibWlucmVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyID0gNTAwMCkgIyBtYW55IGl0ZXIgZm9yIGJvb3RzdHJhcHBlZCBDSXMKcHJpbnQoZWZhX2Q0X2FsbF9yb3RhdGVkTikKCgojIGdldCBsb2FkaW5ncyBmb3IgZWFjaCBmYWN0b3IKZWZhX2Q0X2FsbF9yb3RhdGVkTl9sb2FkaW5ncyA8LSBsb2FkaW5ncyhlZmFfZDRfYWxsX3JvdGF0ZWROKVtdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpCmBgYAoKPHAgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiNoZWFkZXIiPmJhY2sgdG8gVE9DPC9hPjwvcD4KCiMjIyMgRmFjdG9yIGxvYWRpbmdzIHRhYmxlCgpgYGB7ciBzNCBsb2FkaW5ncyB0YWJsZX0KZGF0YS5mcmFtZShsb2FkaW5ncyhmYS5zb3J0KGVmYV9kNF9hbGxfcm90YXRlZE4pKVtdKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIk0iKSksIGZ1bnMocm91bmQyKSkKYGBgCgojIEJpZyBmYWN0b3IgbG9hZGluZ3MgdGFibGUgZm9yIGFsbCBzdHVkaWVzIChTdHVkaWVzIDEtNCkKCmBgYHtyIGFsbCBzdHVkaWVzIGxvYWRpbmdzIHRhYmxlfQojIG1hbnVhbGx5IHNldCAzIGZhY3RvcnMKb3JkZXJfczFfbWFudWFsIDwtIGxvYWRpbmdzKGZhLnNvcnQoZmEoZDFfYWxsLCBuZmFjdG9ycyA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsIGNvciA9IGNob3NlbkNvclR5cGUpKSlbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAib3JkZXIxX21hbnVhbCIpICU+JQogIHJlbmFtZShzMV9oZWFydCA9IE1SMiwgczFfYm9keSA9IE1SMSwgczFfbWluZCA9IE1SMykKCm9yZGVyX3MxIDwtIGxvYWRpbmdzKGZhLnNvcnQoZWZhX2QxX2FsbF9yb3RhdGVkTikpW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiY2FwYWNpdHkiKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIm9yZGVyMSIpICU+JQogIHJlbmFtZShzMV9oZWFydCA9IE1SMiwgczFfYm9keSA9IE1SMSwgczFfbWluZCA9IE1SMykKCm9yZGVyX3MyIDwtIGxvYWRpbmdzKGZhLnNvcnQoZWZhX2QyX2FsbF9yb3RhdGVkTikpW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiY2FwYWNpdHkiKSAlPiUKICByZW5hbWUoczJfYm9keSA9IE1SMiwgczJfaGVhcnQgPSBNUjEsIHMyX21pbmQgPSBNUjMpCgpvcmRlcl9zMyA8LSBsb2FkaW5ncyhmYS5zb3J0KGVmYV9kM19hbGxfcm90YXRlZE4pKVtdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gImNhcGFjaXR5IikgJT4lCiAgcmVuYW1lKHMzX2JvZHkgPSBNUjEsIHMzX2hlYXJ0ID0gTVIyLCBzM19taW5kID0gTVIzKQoKb3JkZXJfczQgPC0gbG9hZGluZ3MoZmEuc29ydChlZmFfZDRfYWxsX3JvdGF0ZWROKSlbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpICU+JQogIHJlbmFtZShzNF9ib2R5ID0gTVIxLCAKICAgICAgICAgIyBzNF9oZWFydCA9IE1SMywgCiAgICAgICAgIHM0X21pbmQgPSBNUjIpCgojIG1hbnVhbGx5IHNldCAzIGZhY3RvcnMKb3JkZXJfczRfbWFudWFsIDwtIGxvYWRpbmdzKGZhLnNvcnQoZmEoZDFfYWxsLCBuZmFjdG9ycyA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsIGNvciA9IGNob3NlbkNvclR5cGUpKSlbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAib3JkZXIxX21hbnVhbCIpICU+JQogIHJlbmFtZShzNF9oZWFydCA9IE1SMiwgczRfYm9keSA9IE1SMSwgczRfbWluZCA9IE1SMykKCmJpZ1RhYmxlIDwtIG9yZGVyX3MxX21hbnVhbCAlPiUgIyBjb3VsZCBzdWJzdGl0dXRlIG9yZGVyX3MxCiAgZnVsbF9qb2luKG9yZGVyX3MyKSAlPiUKICBmdWxsX2pvaW4ob3JkZXJfczMpICU+JQogIGZ1bGxfam9pbihvcmRlcl9zNF9tYW51YWwpICU+JSAjIGNvdWxkIHN1YnN0aXR1dGUgb3JkZXJfczQKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgicyIpKSwgZnVucyhyb3VuZDIpKSAlPiUKICBzZWxlY3Qob3JkZXIxX21hbnVhbCwgIyBjb3VsZCBzdWJpc3RpdHV0ZSBvcmRlcl9zMQogICAgICAgICBjYXBhY2l0eSwgZW5kc193aXRoKCJoZWFydCIpLCBlbmRzX3dpdGgoImJvZHkiKSwgZW5kc193aXRoKCJtaW5kIikpIAoKYmlnVGFibGUKYGBgCgojIEZpZ3VyZXMKCmBgYHtyIHBsb3R0aW5nIHNldHVwIGNoYXJhY3RlciBtZWFucywgaW5jbHVkZSA9IEZ9CiMgYm9vdHN0cmFwIDk1JSBDSXMgZm9yIHJhdGluZ3MgYnkgY2hhcmFjdGVyIChub25wYXJhbWV0cmljKQojIHN0dWR5IDEKY2hhcl9wbG90dGluZ19yYXRpbmdzX3MxIDwtIGQxICU+JSAKICBzZWxlY3Qoc3ViaWQsIGNoYXJhY3RlciwgY2FwYWNpdHksIHJlc3BvbnNlTnVtKSAlPiUKICBncm91cF9ieShjaGFyYWN0ZXIsIGNhcGFjaXR5KSAlPiUKICBkbyhkYXRhLmZyYW1lKHJiaW5kKHNtZWFuLmNsLmJvb3QoLiRyZXNwb25zZU51bSkpKSkgJT4lCiAgZnVsbF9qb2luKGRlbW9TYW1wbGVTaXplKCJzdHVkeSAxIikgJT4lIGZpbHRlcihjaGFyYWN0ZXIgIT0gImFsbCIpKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAic3R1ZHkgMSIpCgojIHN0dWR5IDIKY2hhcl9wbG90dGluZ19yYXRpbmdzX3MyIDwtIGQyICU+JSAKICBzZWxlY3Qoc3ViaWQsIGNoYXJhY3RlciwgY2FwYWNpdHksIHJlc3BvbnNlTnVtKSAlPiUKICBncm91cF9ieShjaGFyYWN0ZXIsIGNhcGFjaXR5KSAlPiUKICBkbyhkYXRhLmZyYW1lKHJiaW5kKHNtZWFuLmNsLmJvb3QoLiRyZXNwb25zZU51bSkpKSkgJT4lCiAgZnVsbF9qb2luKGRlbW9TYW1wbGVTaXplKCJzdHVkeSAyIikgJT4lIGZpbHRlcihjaGFyYWN0ZXIgIT0gImFsbCIpKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAic3R1ZHkgMiIpCgojIHN0dWR5IDMKY2hhcl9wbG90dGluZ19yYXRpbmdzX3MzIDwtIGQzICU+JSAKICBzZWxlY3Qoc3ViaWQsIGNoYXJhY3RlciwgY2FwYWNpdHksIHJlc3BvbnNlTnVtKSAlPiUKICBncm91cF9ieShjaGFyYWN0ZXIsIGNhcGFjaXR5KSAlPiUKICBkbyhkYXRhLmZyYW1lKHJiaW5kKHNtZWFuLmNsLmJvb3QoLiRyZXNwb25zZU51bSkpKSkgJT4lCiAgZnVsbF9qb2luKGRlbW9TYW1wbGVTaXplKCJzdHVkeSAzIikgJT4lIGZpbHRlcihjaGFyYWN0ZXIgIT0gImFsbCIpKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAic3R1ZHkgMyIpCgojIHN0dWR5IDQKY2hhcl9wbG90dGluZ19yYXRpbmdzX3M0IDwtIGQ0ICU+JSAKICBzZWxlY3Qoc3ViaWQsIGNoYXJhY3RlciwgY2FwYWNpdHksIHJlc3BvbnNlTnVtKSAlPiUKICBncm91cF9ieShjaGFyYWN0ZXIsIGNhcGFjaXR5KSAlPiUKICBkbyhkYXRhLmZyYW1lKHJiaW5kKHNtZWFuLmNsLmJvb3QoLiRyZXNwb25zZU51bSkpKSkgJT4lCiAgZnVsbF9qb2luKGRlbW9TYW1wbGVTaXplKCJzdHVkeSA0IikgJT4lIGZpbHRlcihjaGFyYWN0ZXIgIT0gImFsbCIpKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAic3R1ZHkgNCIpCmBgYAoKYGBge3IgcGxvdHRpbmcgc2V0dXAgY2hhcmFjdGVyIG1lYW5zIG1lcmdlLCBpbmNsdWRlID0gRn0KY2hhcl9wbG90dGluZ19yYXRpbmdzX2FsbCA8LSBjaGFyX3Bsb3R0aW5nX3JhdGluZ3NfczEgJT4lCiAgZnVsbF9qb2luKGNoYXJfcGxvdHRpbmdfcmF0aW5nc19zMikgJT4lCiAgZnVsbF9qb2luKGNoYXJfcGxvdHRpbmdfcmF0aW5nc19zMykgJT4lCiAgZnVsbF9qb2luKGNoYXJfcGxvdHRpbmdfcmF0aW5nc19zNCkgJT4lCiAgZmlsdGVyKCFpcy5uYShjaGFyYWN0ZXIpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gZmFjdG9yKHN0dWR5KSwKICAgICAgICAgY29uZGl0aW9uID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgImRvbGwiLCAidGVkZHlfYmVhciIsICJyb2JvdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVldGxlIiwgImJpcmQiLCAibW91c2UiLCAiZ29hdCIsICJlbGVwaGFudCIpKSkKYGBgCgpgYGB7ciBwbG90dGluZyBzZXR1cCBjYXBhY2l0eSB3b3JkaW5ncywgaW5jbHVkZSA9IEZ9CmNoYXJfcGxvdHRpbmdfd29yZGluZ3MgPC0gY2hhcl9wbG90dGluZ19yYXRpbmdzX2FsbCAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KGNhcGFjaXR5KSAlPiUKICBkaXN0aW5jdCgpICU+JSAKICBtdXRhdGUod29yZGluZyA9IGZhY3RvcigKICAgIHJlY29kZShjYXBhY2l0eSwKICAgICAgICAgICBoYXBweSA9ICJmZWVsIGhhcHB5IiwKICAgICAgICAgICBkZXByZXNzZWQgPSAiZmVlbCBzYWQiLAogICAgICAgICAgIGZlYXIgPSAiZmVlbCBzY2FyZWQiLAogICAgICAgICAgIGFuZ3J5ID0gImdldCBhbmdyeSIsCiAgICAgICAgICAgY2FsbSA9ICJmZWVsIGNhbG0iLAogICAgICAgICAgIHNvdW5kcyA9ICJoZWFyIHNvdW5kcyIsCiAgICAgICAgICAgc2VlaW5nID0gInNlZSB0aGluZ3MiLAogICAgICAgICAgIHRlbXBlcmF0dXJlID0gInNlbnNlIHRlbXBlcmF0dXJlcyIsCiAgICAgICAgICAgb2RvcnMgPSAic21lbGwgdGhpbmdzIiwKICAgICAgICAgICBkZXB0aCA9ICJzZW5zZS4uLiBjbG9zZSBieSBvciBmYXIgYXdheSIsCiAgICAgICAgICAgY29tcHV0YXRpb25zID0gImRvIG1hdGgiLAogICAgICAgICAgIHRob3VnaHRzID0gImhhdmUgdGhvdWdodHMiLAogICAgICAgICAgIHJlYXNvbmluZyA9ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MiLAogICAgICAgICAgIHJlbWVtYmVyaW5nID0gInJlbWVtYmVyIHRoaW5ncyIsCiAgICAgICAgICAgYmVsaWVmcyA9ICJoYXZlIGJlbGllZnMuLi4iLAogICAgICAgICAgIGh1bmdyeSA9ICJnZXQgaHVuZ3J5IiwKICAgICAgICAgICB0aXJlZCA9ICJmZWVsIHRpcmVkIiwKICAgICAgICAgICBwYWluID0gImZlZWwgcGFpbiIsCiAgICAgICAgICAgbmF1c2VhdGVkID0gImZlZWwgc2ljay4uLiIsCiAgICAgICAgICAgc2FmZSA9ICJmZWVsIHNhZmUiLAogICAgICAgICAgIGxvdmUgPSAiZmVlbCBsb3ZlIiwKICAgICAgICAgICByZWNvZ25pemluZyA9ICJyZWNvZ25pemUgc29tZWJvZHkgZWxzZSIsCiAgICAgICAgICAgY29tbXVuaWNhdGluZyA9ICJjb21tdW5pY2F0ZSB3aXRoIHNvbWVib2R5IGVsc2UiLAogICAgICAgICAgIGd1aWx0ID0gImZlZWwgZ3VpbHR5IiwKICAgICAgICAgICBkaXNyZXNwZWN0ZWQgPSAiZ2V0IGh1cnQgZmVlbGluZ3MiLAogICAgICAgICAgIGZyZWVfd2lsbCA9ICJkZWNpZGUgd2hhdCB0byBkbyIsCiAgICAgICAgICAgY2hvaWNlcyA9ICJtYWtlIGNob2ljZXMiLAogICAgICAgICAgIHNlbGZfcmVzdHJhaW50ID0gImhhdmUgc2VsZi1jb250cm9sLi4uIiwKICAgICAgICAgICBpbnRlbnRpb25zID0gIm1ha2UgcGxhbnMiLAogICAgICAgICAgIGdvYWwgPSAiaGF2ZSBnb2Fscy4uLiIsCiAgICAgICAgICAgY29uc2Npb3VzID0gImJlIGF3YXJlIG9mIHRoaW5ncyIsCiAgICAgICAgICAgc2VsZl9hd2FyZSA9ICJiZSBhd2FyZSBvZiBpdHNlbGYiLAogICAgICAgICAgIGRlc2lyZXMgPSAiaGF2ZSBkZXNpcmVzLi4uIiwKICAgICAgICAgICBlbWJhcnJhc3NlZCA9ICJmZWVsIGVtYmFycmFzc2VkIiwKICAgICAgICAgICBlbW9fcmVjb2cgPSAidW5kZXJzdGFuZCBob3cgc29tZWJvZHkgZWxzZSBpcyBmZWVsaW5nIiwKICAgICAgICAgICBqb3kgPSAiZmVlbCBqb3kiLAogICAgICAgICAgIG1vcmFsaXR5ID0gImtub3cgd2hhdCdzIG5pY2UgYW5kIHdoYXQncyBtZWFuIiwKICAgICAgICAgICBwZXJzb25hbGl0eSA9ICJoYXZlIGEgcGVyc29uYWxpdHkuLi4iLAogICAgICAgICAgIHBsZWFzdXJlID0gImZlZWwgcGxlYXN1cmUuLi4iLAogICAgICAgICAgIHByaWRlID0gImZlZWwgcHJvdWQiKSkpCmBgYAoKYGBge3IgcGxvdHRpbmcgc2V0dXAgbG9hZGluZ3MsIGluY2x1ZGUgPSBGfQojIG1lcmdlIHdpdGggbG9hZGluZ3MsIG9yZGVyaW5ncywgYW5kIGRvbWluYW50IGZhY3RvcnMgZnJvbSBlYWNoIHN0dWR5IApjaGFyX3Bsb3R0aW5nIDwtIGNoYXJfcGxvdHRpbmdfcmF0aW5nc19hbGwgJT4lCiAgZnVsbF9qb2luKGNoYXJfcGxvdHRpbmdfd29yZGluZ3MpICU+JQogIGZ1bGxfam9pbihvcmRlcl9zMSAlPiUKICAgICAgICAgICAgICByZW5hbWUoczFfTVIxID0gczFfYm9keSwgczFfTVIyID0gczFfaGVhcnQsIHMxX01SMyA9IHMxX21pbmQpICU+JQogICAgICAgICAgICAgIG11dGF0ZShzMV9NUjFfYWJzID0gYWJzKHMxX01SMSksCiAgICAgICAgICAgICAgICAgICAgIHMxX01SMl9hYnMgPSBhYnMoczFfTVIyKSwKICAgICAgICAgICAgICAgICAgICAgczFfTVIzX2FicyA9IGFicyhzMV9NUjMpLAogICAgICAgICAgICAgICAgICAgICBzMV9mYWN0b3IgPSAKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoczFfTVIxX2FicyA+IHMxX01SMl9hYnMgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxX01SMV9hYnMgPiBzMV9NUjNfYWJzLCAiQk9EWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzMV9NUjJfYWJzID4gczFfTVIxX2FicyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxX01SMl9hYnMgPiBzMV9NUjNfYWJzLCAiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHMxX01SM19hYnMgPiBzMV9NUjFfYWJzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxX01SM19hYnMgPiBzMV9NUjJfYWJzLCAiTUlORCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSksCiAgICAgICAgICAgICAgICAgICAgIHMxX2NvbG9yID0gcmVjb2RlKHMxX2ZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJPRFkiID0gIiNFNDFBMUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSEVBUlQiID0gIiMzNzdFQjgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlORCIgPSAiIzREQUY0QSIpLAogICAgICAgICAgICAgICAgICAgICBzMV9vcmRlciA9IGFzLm51bWVyaWMob3JkZXIxKSkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KC1zMV9NUjFfYWJzLCAtczFfTVIyX2FicywgLXMxX01SM19hYnMpKSAlPiUKICBmdWxsX2pvaW4ob3JkZXJfczIgJT4lCiAgICAgICAgICAgICAgZGF0YS5mcmFtZSgpICU+JQogICAgICAgICAgICAgIHJlbmFtZShzMl9NUjEgPSBzMl9oZWFydCwgczJfTVIyID0gczJfYm9keSwgczJfTVIzID0gczJfbWluZCkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKHMyX01SMV9hYnMgPSBhYnMoczJfTVIxKSwKICAgICAgICAgICAgICAgICAgICAgczJfTVIyX2FicyA9IGFicyhzMl9NUjIpLAogICAgICAgICAgICAgICAgICAgICBzMl9NUjNfYWJzID0gYWJzKHMyX01SMyksCiAgICAgICAgICAgICAgICAgICAgIHMyX2ZhY3RvciA9IAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzMl9NUjFfYWJzID4gczJfTVIyX2FicyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczJfTVIxX2FicyA+IHMyX01SM19hYnMsICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHMyX01SMl9hYnMgPiBzMl9NUjFfYWJzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczJfTVIyX2FicyA+IHMyX01SM19hYnMsICJIRUFSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoczJfTVIzX2FicyA+IHMyX01SMV9hYnMgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczJfTVIzX2FicyA+IHMyX01SMl9hYnMsICJNSU5EIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSwKICAgICAgICAgICAgICAgICAgICAgczJfY29sb3IgPSByZWNvZGUoczJfZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk9EWSIgPSAiI0U0MUExQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIRUFSVCIgPSAiIzM3N0VCOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSU5EIiA9ICIjNERBRjRBIikpICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiczJfb3JkZXIiKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoczJfb3JkZXIgPSBhcy5udW1lcmljKHMyX29yZGVyKSkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KC1zMl9NUjFfYWJzLCAtczJfTVIyX2FicywgLXMyX01SM19hYnMpKSAlPiUKICBmdWxsX2pvaW4ob3JkZXJfczMgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKHMzX01SMSA9IHMzX2hlYXJ0LCBzM19NUjIgPSBzM19ib2R5LCBzM19NUjMgPSBzM19taW5kKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoczNfTVIxX2FicyA9IGFicyhzM19NUjEpLAogICAgICAgICAgICAgICAgICAgICBzM19NUjJfYWJzID0gYWJzKHMzX01SMiksCiAgICAgICAgICAgICAgICAgICAgIHMzX01SM19hYnMgPSBhYnMoczNfTVIzKSwKICAgICAgICAgICAgICAgICAgICAgczNfZmFjdG9yID0gCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHMzX01SMV9hYnMgPiBzM19NUjJfYWJzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzM19NUjFfYWJzID4gczNfTVIzX2FicywgIkJPRFkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoczNfTVIyX2FicyA+IHMzX01SMV9hYnMgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzM19NUjJfYWJzID4gczNfTVIzX2FicywgIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzM19NUjNfYWJzID4gczNfTVIxX2FicyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzM19NUjNfYWJzID4gczNfTVIyX2FicywgIk1JTkQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpLAogICAgICAgICAgICAgICAgICAgICBzM19jb2xvciA9IHJlY29kZShzM19mYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCT0RZIiA9ICIjRTQxQTFDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhFQVJUIiA9ICIjMzc3RUI4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JTkQiID0gIiM0REFGNEEiKSkgJT4lCiAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJzM19vcmRlciIpICU+JQogICAgICAgICAgICAgIG11dGF0ZShzM19vcmRlciA9IGFzLm51bWVyaWMoczNfb3JkZXIpKSAlPiUKICAgICAgICAgICAgICBzZWxlY3QoLXMzX01SMV9hYnMsIC1zM19NUjJfYWJzLCAtczNfTVIzX2FicykpICU+JQogIGZ1bGxfam9pbihvcmRlcl9zNCAlPiUKICAgICAgICAgICAgICByZW5hbWUoczRfTVIxID0gczRfYm9keSwgczRfTVIyID0gczRfbWluZCkgJT4lICMsIHM0X01SMyA9IHM0X2hlYXJ0KSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoczRfTVIxX2FicyA9IGFicyhzNF9NUjEpLAogICAgICAgICAgICAgICAgICAgICBzNF9NUjJfYWJzID0gYWJzKHM0X01SMiksCiAgICAgICAgICAgICAgICAgICAgICMgczRfTVIzX2FicyA9IGFicyhzNF9NUjMpLAogICAgICAgICAgICAgICAgICAgICBzNF9mYWN0b3IgPSAKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoczRfTVIxX2FicyA+IHM0X01SMl9hYnMsICJCT0RZIiwgIk1JTkQiKSwKICAgICAgICAgICAgICAgICAgICAgIyBzNF9mYWN0b3IgPSAKICAgICAgICAgICAgICAgICAgICAgIyAgIGlmZWxzZShzNF9NUjFfYWJzID4gczRfTVIyX2FicyAmCiAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBzNF9NUjFfYWJzID4gczRfTVIzX2FicywgIkJPRFkiLAogICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIGlmZWxzZShzNF9NUjJfYWJzID4gczRfTVIxX2FicyAmCiAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgczRfTVIyX2FicyA+IHM0X01SM19hYnMsICJIRUFSVCIsCiAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgIGlmZWxzZShzNF9NUjNfYWJzID4gczRfTVIxX2FicyAmCiAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgIHM0X01SM19hYnMgPiBzNF9NUjJfYWJzLCAiTUlORCIsCiAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSwKICAgICAgICAgICAgICAgICAgICAgczRfY29sb3IgPSByZWNvZGUoczRfZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk9EWSIgPSAiI0U0MUExQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIRUFSVCIgPSAiIzM3N0VCOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSU5EIiA9ICIjNERBRjRBIikpICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiczRfb3JkZXIiKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoczRfb3JkZXIgPSBhcy5udW1lcmljKHM0X29yZGVyKSkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KC1zNF9NUjFfYWJzLCAtczRfTVIyX2FicykpICMsIC1zNF9NUjNfYWJzKSkKCiMgY29uZmlndXJlIHBsb3QgbGFiZWxzCmxhYmVsX2RmX3MxIDwtIGNoYXJfcGxvdHRpbmcgJT4lIGZpbHRlcihzdHVkeSA9PSAic3R1ZHkgMSIpICU+JSBzZWxlY3QoY29uZGl0aW9uLCBuKSAlPiUgdW5pcXVlKCkKbGFiZWxfZGZfczIgPC0gY2hhcl9wbG90dGluZyAlPiUgZmlsdGVyKHN0dWR5ID09ICJzdHVkeSAyIikgJT4lIHNlbGVjdChjb25kaXRpb24sIG4pICU+JSB1bmlxdWUoKQpsYWJlbF9kZl9zMyA8LSBjaGFyX3Bsb3R0aW5nICU+JSBmaWx0ZXIoc3R1ZHkgPT0gInN0dWR5IDMiKSAlPiUgc2VsZWN0KGNvbmRpdGlvbiwgbikgJT4lIHVuaXF1ZSgpCmxhYmVsX2RmX3M0IDwtIGNoYXJfcGxvdHRpbmcgJT4lIGZpbHRlcihzdHVkeSA9PSAic3R1ZHkgNCIpICU+JSBzZWxlY3QoY29uZGl0aW9uLCBuKSAlPiUgdW5pcXVlKCkKCmZhY2V0TGFic19zMSA8LSBnc3ViKCIgXFwoIiwgIlxuKCIsIG1ha2VGYWNldExhYnMoY2hhcl9wbG90dGluZyAlPiUgZmlsdGVyKHN0dWR5ID09ICJzdHVkeSAxIikpKQpmYWNldExhYnNfczIgPC0gZ3N1YigiIFxcKCIsICJcbigiLCBtYWtlRmFjZXRMYWJzKGNoYXJfcGxvdHRpbmcgJT4lIGZpbHRlcihzdHVkeSA9PSAic3R1ZHkgMiIpKSkKZmFjZXRMYWJzX3MzIDwtIGdzdWIoIiBcXCgiLCAiXG4oIiwgbWFrZUZhY2V0TGFicyhjaGFyX3Bsb3R0aW5nICU+JSBmaWx0ZXIoc3R1ZHkgPT0gInN0dWR5IDMiKSkpCmZhY2V0TGFic19zNCA8LSBnc3ViKCIgXFwoIiwgIlxuKCIsIG1ha2VGYWNldExhYnMoY2hhcl9wbG90dGluZyAlPiUgZmlsdGVyKHN0dWR5ID09ICJzdHVkeSA0IikpKQoKIyBjb25maWd1cmUgY3VzdG9tIHBhbGV0dGUKbXlQYWxldHRlIDwtIGJyZXdlci5wYWwoMywgIlNldDEiKTsgbmFtZXMobXlQYWxldHRlKSA8LSBjKCJIRUFSVCIsICJCT0RZIiwgIk1JTkQiKQoKcGFsZXR0ZV9iYXNlIDwtIGNoYXJfcGxvdHRpbmcgJT4lIAogIHNlbGVjdChjYXBhY2l0eSwgZW5kc193aXRoKCJfZmFjdG9yIikpICU+JQogIGRpc3RpbmN0KCkKIyBhZGp1c3QgYnkgaGFuZCBkZXBlbmRpbmcgb24gb3JkZXIgb2YgZmFjdG9ycyEhCnBhbGV0dGVfczEgPC0gYyhyZXAobXlQYWxldHRlWyJNSU5EIl0sIHBhbGV0dGVfYmFzZSAlPiUgZmlsdGVyKHMxX2ZhY3RvciA9PSAiTUlORCIpICU+JSBjb3VudCgpKSwKICAgICAgICAgICAgICAgIHJlcChteVBhbGV0dGVbIkhFQVJUIl0sIHBhbGV0dGVfYmFzZSAlPiUgZmlsdGVyKHMxX2ZhY3RvciA9PSAiSEVBUlQiKSAlPiUgY291bnQoKSksCiAgICAgICAgICAgICAgICByZXAobXlQYWxldHRlWyJCT0RZIl0sIHBhbGV0dGVfYmFzZSAlPiUgZmlsdGVyKHMxX2ZhY3RvciA9PSAiQk9EWSIpICU+JSBjb3VudCgpKSkKcGFsZXR0ZV9zMiA8LSBjKHJlcChteVBhbGV0dGVbIk1JTkQiXSwgcGFsZXR0ZV9iYXNlICU+JSBmaWx0ZXIoczJfZmFjdG9yID09ICJNSU5EIikgJT4lIGNvdW50KCkpLAogICAgICAgICAgICAgICAgcmVwKG15UGFsZXR0ZVsiQk9EWSJdLCBwYWxldHRlX2Jhc2UgJT4lIGZpbHRlcihzMl9mYWN0b3IgPT0gIkJPRFkiKSAlPiUgY291bnQoKSksCiAgICAgICAgICAgICAgICByZXAobXlQYWxldHRlWyJIRUFSVCJdLCBwYWxldHRlX2Jhc2UgJT4lIGZpbHRlcihzMl9mYWN0b3IgPT0gIkhFQVJUIikgJT4lIGNvdW50KCkpKQpwYWxldHRlX3MzIDwtIGMocmVwKG15UGFsZXR0ZVsiTUlORCJdLCBwYWxldHRlX2Jhc2UgJT4lIGZpbHRlcihzM19mYWN0b3IgPT0gIk1JTkQiKSAlPiUgY291bnQoKSksCiAgICAgICAgICAgICAgICByZXAobXlQYWxldHRlWyJCT0RZIl0sIHBhbGV0dGVfYmFzZSAlPiUgZmlsdGVyKHMzX2ZhY3RvciA9PSAiQk9EWSIpICU+JSBjb3VudCgpKSwKICAgICAgICAgICAgICAgIHJlcChteVBhbGV0dGVbIkhFQVJUIl0sIHBhbGV0dGVfYmFzZSAlPiUgZmlsdGVyKHMzX2ZhY3RvciA9PSAiSEVBUlQiKSAlPiUgY291bnQoKSkpCiMgcGFsZXR0ZV9zNCA8LSBjKHJlcChteVBhbGV0dGVbIk1JTkQiXSwgcGFsZXR0ZV9iYXNlICU+JSBmaWx0ZXIoczRfZmFjdG9yID09ICJNSU5EIikgJT4lIGNvdW50KCkpLAojICAgICAgICAgICAgICAgICByZXAobXlQYWxldHRlWyJIRUFSVCJdLCBwYWxldHRlX2Jhc2UgJT4lIGZpbHRlcihzNF9mYWN0b3IgPT0gIkhFQVJUIikgJT4lIGNvdW50KCkpLAojICAgICAgICAgICAgICAgICByZXAobXlQYWxldHRlWyJCT0RZIl0sIHBhbGV0dGVfYmFzZSAlPiUgZmlsdGVyKHM0X2ZhY3RvciA9PSAiQk9EWSIpICU+JSBjb3VudCgpKSkKYGBgCgojIyAzRCBzY2F0dGVycGxvdHMKCkZhY3RvciBsb2FkaW5ncyBmb3IgdGhlIDQwIG1lbnRhbCBjYXBhY2l0aWVzIG9uIHRoZSB0aHJlZSByb3RhdGVkIGZhY3RvcnMgaW4gU3R1ZHkgMS4gSXRlbXMgYXJlIGNvbG9yZWQgYnkgdGhlaXIgZG9taW5hbnQgZmFjdG9yIGxvYWRpbmc6IEl0ZW1zIHRoYXQgbG9hZGVkIG1vc3Qgc3Ryb25nbHkgb24gdGhlIGJvZHkgZmFjdG9yIChib2RpbHkgc3RhdGVzIGFuZCB3aWxsKSBhcmUgaW4gcmVkOyBpdGVtcyB0aGF0IGxvYWRlZCBtb3N0IHN0cm9uZ2x5IG9uIHRoZSBoZWFydCBmYWN0b3IgKHNvY2lhbC1lbW90aW9uYWwgZXhwZXJpZW5jZXMgYW5kIG1vcmFsaXR5KSBhcmUgaW4gYmx1ZTsgYW5kIGl0ZW1zIHRoYXQgbG9hZGVkIG1vc3Qgc3Ryb25nbHkgb24gdGhlIG1pbmQgZmFjdG9yIChwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMgYW5kIGdvYWwgcHVyc3VpdCkgYXJlIGluIGdyZWVuLgoKIyMjIFN0dWR5IDEgKGFkdWx0cykKCmBgYHtyIGZpZ3VyZSAzZCBzY2F0dGVyIHMxfQojIHNldCB1cCBsYWJlbHMgZm9yIHBsb3QgKHNob3J0ZW5lZCB2ZXJzaW9uIG9mIG1lbnRhbCBjYXBhY2l0eSBpdGVtcykKd29yZGluZ19zMSA8LSBsb2FkaW5ncyhlZmFfZDFfYWxsX3JvdGF0ZWROKVtdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIml0ZW0iKSAlPiUKICBzZWxlY3QoaXRlbSkgJT4lCiAgbXV0YXRlKHdvcmRpbmcgPSBmYWN0b3IoCiAgICByZWNvZGUoaXRlbSwKICAgICAgICAgICBoYXBweSA9ICJmZWVsIGhhcHB5IiwKICAgICAgICAgICBkZXByZXNzZWQgPSAiZmVlbCBzYWQiLAogICAgICAgICAgIGZlYXIgPSAiZmVlbCBzY2FyZWQiLAogICAgICAgICAgIGFuZ3J5ID0gImdldCBhbmdyeSIsCiAgICAgICAgICAgY2FsbSA9ICJmZWVsIGNhbG0iLAogICAgICAgICAgIHNvdW5kcyA9ICJoZWFyIHNvdW5kcyIsCiAgICAgICAgICAgc2VlaW5nID0gInNlZSB0aGluZ3MiLAogICAgICAgICAgIHRlbXBlcmF0dXJlID0gInNlbnNlIHRlbXBlcmF0dXJlcyIsCiAgICAgICAgICAgb2RvcnMgPSAic21lbGwgdGhpbmdzIiwKICAgICAgICAgICBkZXB0aCA9ICJzZW5zZSB3aGV0aGVyIHNvbWV0aGluZyBpcyBjbG9zZSBieSBvciBmYXIgYXdheSIsCiAgICAgICAgICAgY29tcHV0YXRpb25zID0gImRvIG1hdGgiLAogICAgICAgICAgIHRob3VnaHRzID0gImhhdmUgdGhvdWdodHMiLAogICAgICAgICAgIHJlYXNvbmluZyA9ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MiLAogICAgICAgICAgIHJlbWVtYmVyaW5nID0gInJlbWVtYmVyIHRoaW5ncyIsCiAgICAgICAgICAgYmVsaWVmcyA9ICJoYXZlIGJlbGllZnMsIGxpa2Ugd2hlbiB5b3UgdGhpbmsgc29tZXRoaW5nIGlzIHRydWUiLAogICAgICAgICAgIGh1bmdyeSA9ICJnZXQgaHVuZ3J5IiwKICAgICAgICAgICB0aXJlZCA9ICJmZWVsIHRpcmVkIiwKICAgICAgICAgICBwYWluID0gImZlZWwgcGFpbiIsCiAgICAgICAgICAgbmF1c2VhdGVkID0gImZlZWwgc2ljaywgbGlrZSB3aGVuIHlvdSBmZWVsIGxpa2UgeW91IG1pZ2h0IHRocm93IHVwIiwKICAgICAgICAgICBzYWZlID0gImZlZWwgc2FmZSIsCiAgICAgICAgICAgbG92ZSA9ICJmZWVsIGxvdmUiLAogICAgICAgICAgIHJlY29nbml6aW5nID0gInJlY29nbml6ZSBzb21lYm9keSBlbHNlIiwKICAgICAgICAgICBjb21tdW5pY2F0aW5nID0gImNvbW11bmljYXRlIHdpdGggc29tZWJvZHkgZWxzZSIsCiAgICAgICAgICAgZ3VpbHQgPSAiZmVlbCBndWlsdHkiLAogICAgICAgICAgIGRpc3Jlc3BlY3RlZCA9ICJnZXQgaHVydCBmZWVsaW5ncyIsCiAgICAgICAgICAgZnJlZV93aWxsID0gImRlY2lkZSB3aGF0IHRvIGRvIiwKICAgICAgICAgICBjaG9pY2VzID0gIm1ha2UgY2hvaWNlcyIsCiAgICAgICAgICAgc2VsZl9yZXN0cmFpbnQgPSAiaGF2ZSBzZWxmLWNvbnRyb2wsIGxpa2Ugd2hlbiB5b3Ugc3RvcCB5b3Vyc2VsZiBmcm9tIGRvaW5nIHNvbWV0aGluZyB5b3Ugc2hvdWxkbid0IGRvIiwKICAgICAgICAgICBpbnRlbnRpb25zID0gIm1ha2UgcGxhbnMiLAogICAgICAgICAgIGdvYWwgPSAiaGF2ZSBnb2FscywgbGlrZSB3aGVuIHlvdSdyZSB3b3JraW5nIGhhcmQgdG8gZG8gc29tZXRoaW5nIG9yIG1ha2Ugc29tZXRoaW5nIGhhcHBlbiIsCiAgICAgICAgICAgY29uc2Npb3VzID0gImJlIGF3YXJlIG9mIHRoaW5ncyIsCiAgICAgICAgICAgc2VsZl9hd2FyZSA9ICJiZSBhd2FyZSBvZiBpdHNlbGYiLAogICAgICAgICAgIGRlc2lyZXMgPSAiaGF2ZSBkZXNpcmVzLCBsaWtlIHdoZW4geW91IHJlYWxseSB3YW50IHNvbWV0aGluZyIsCiAgICAgICAgICAgZW1iYXJyYXNzZWQgPSAiZmVlbCBlbWJhcnJhc3NlZCIsCiAgICAgICAgICAgZW1vX3JlY29nID0gInVuZGVyc3RhbmQgaG93IHNvbWVib2R5IGVsc2UgaXMgZmVlbGluZyIsCiAgICAgICAgICAgam95ID0gImZlZWwgam95IiwKICAgICAgICAgICBtb3JhbGl0eSA9ICJrbm93IHdoYXQncyBuaWNlIGFuZCB3aGF0J3MgbWVhbiIsCiAgICAgICAgICAgcGVyc29uYWxpdHkgPSAiaGF2ZSBhIHBlcnNvbmFsaXR5LCBsaWtlIHdoZW4gc29tZW9uZSBpcyBzaHkgYW5kIHNvbWVib2R5IGVsc2UgaXMgc2lsbHkiLAogICAgICAgICAgIHBsZWFzdXJlID0gImZlZWwgcGxlYXN1cmUsIGxpa2Ugd2hlbiBzb21ldGhpbmcgZmVlbHMgcmVhbGx5IGdvb2QiLAogICAgICAgICAgIHByaWRlID0gImZlZWwgcHJvdWQiKSkpICU+JQogICAgbXV0YXRlKHNob3J0ID0gZmFjdG9yKAogICAgICByZWNvZGUoaXRlbSwKICAgICAgICAgICAgIGhhcHB5ID0gImhhcHB5IiwKICAgICAgICAgICAgIGRlcHJlc3NlZCA9ICJzYWQiLAogICAgICAgICAgIGZlYXIgPSAic2NhcmVkIiwKICAgICAgICAgICBhbmdyeSA9ICJhbmdyeSIsCiAgICAgICAgICAgY2FsbSA9ICJjYWxtIiwKICAgICAgICAgICBzb3VuZHMgPSAiaGVhciIsCiAgICAgICAgICAgc2VlaW5nID0gInNlZSIsCiAgICAgICAgICAgdGVtcGVyYXR1cmUgPSAidGVtcGVyYXR1cmVzIiwKICAgICAgICAgICBvZG9ycyA9ICJzbWVsbCIsCiAgICAgICAgICAgZGVwdGggPSAiZGVwdGgiLAogICAgICAgICAgIGNvbXB1dGF0aW9ucyA9ICJtYXRoIiwKICAgICAgICAgICB0aG91Z2h0cyA9ICJ0aG91Z2h0cyIsCiAgICAgICAgICAgcmVhc29uaW5nID0gImZpZ3VyZSBvdXQiLAogICAgICAgICAgIHJlbWVtYmVyaW5nID0gInJlbWVtYmVyIiwKICAgICAgICAgICBiZWxpZWZzID0gImJlbGllZnMiLAogICAgICAgICAgIGh1bmdyeSA9ICJodW5ncnkiLAogICAgICAgICAgIHRpcmVkID0gInRpcmVkIiwKICAgICAgICAgICBwYWluID0gInBhaW4iLAogICAgICAgICAgIG5hdXNlYXRlZCA9ICJzaWNrIiwKICAgICAgICAgICBzYWZlID0gInNhZmUiLAogICAgICAgICAgIGxvdmUgPSAibG92ZSIsCiAgICAgICAgICAgcmVjb2duaXppbmcgPSAicmVjb2duaXplIiwKICAgICAgICAgICBjb21tdW5pY2F0aW5nID0gImNvbW11bmljYXRlIiwKICAgICAgICAgICBndWlsdCA9ICJndWlsdHkiLAogICAgICAgICAgIGRpc3Jlc3BlY3RlZCA9ICJodXJ0IGZlZWxpbmdzIiwKICAgICAgICAgICBmcmVlX3dpbGwgPSAiZGVjaWRlIiwKICAgICAgICAgICBjaG9pY2VzID0gImNob2ljZXMiLAogICAgICAgICAgIHNlbGZfcmVzdHJhaW50ID0gInNlbGYtY29udHJvbCIsCiAgICAgICAgICAgaW50ZW50aW9ucyA9ICJwbGFucyIsCiAgICAgICAgICAgZ29hbCA9ICJnb2FscyIsCiAgICAgICAgICAgY29uc2Npb3VzID0gImF3YXJlIiwKICAgICAgICAgICBzZWxmX2F3YXJlID0gInNlbGYtYXdhcmUiLAogICAgICAgICAgIGRlc2lyZXMgPSAiZGVzaXJlcyIsCiAgICAgICAgICAgZW1iYXJyYXNzZWQgPSAiZW1iYXJyYXNzZWQiLAogICAgICAgICAgIGVtb19yZWNvZyA9ICJlbXBhdGh5IiwKICAgICAgICAgICBqb3kgPSAiam95IiwKICAgICAgICAgICBtb3JhbGl0eSA9ICJtb3JhbGl0eSIsCiAgICAgICAgICAgcGVyc29uYWxpdHkgPSAicGVyc29uYWxpdHkiLAogICAgICAgICAgIHBsZWFzdXJlID0gInBsZWFzdXJlIiwKICAgICAgICAgICBwcmlkZSA9ICJwcmlkZSIpKSkKCiMgbWFrZSBkYXRhZnJhbWUgZm9yIHBsb3R0aW5nCnNjYXR0ZXJfcGxvdHRpbmcgPC0gbG9hZGluZ3MoZWZhX2QxX2FsbF9yb3RhdGVkTilbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJpdGVtIikgJT4lCiAgcmVuYW1lKEJPRFkgPSBNUjEsCiAgICAgICAgIEhFQVJUID0gTVIyLAogICAgICAgICBNSU5EID0gTVIzKSAlPiUKICBmdWxsX2pvaW4od29yZGluZ19zMSkgJT4lCiAgbXV0YXRlKGRvbWluYW50ID0gZmFjdG9yKAogICAgaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhCT0RZKSwgIkJPRFkiLAogICAgICAgICAgIGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoSEVBUlQpLCAiSEVBUlQiLAogICAgICAgICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKE1JTkQpLCAiTUlORCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSksCiAgICBzaXplID0gaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhCT0RZKSwgYWJzKEJPRFkpLAogICAgICAgICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKEhFQVJUKSwgYWJzKEhFQVJUKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoTUlORCksIGFicyhNSU5EKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSwKICAgIGNvbG9yID0gaWZlbHNlKGRvbWluYW50ID09ICJCT0RZIiwgIiNFNDFBMUMiLAogICAgICAgICAgICAgICAgICAgaWZlbHNlKGRvbWluYW50ID09ICJIRUFSVCIsICIjMzc3RUI4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZG9taW5hbnQgPT0gIk1JTkQiLCAiIzREQUY0QSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKQoKIyBwbG90IQpmaWdTMSA8LSBwbG90X2x5KHNjYXR0ZXJfcGxvdHRpbmcsIHggPSB+SEVBUlQsIHkgPSB+Qk9EWSwgeiA9IH5NSU5ELAogICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICAgY29sb3IgPSB+ZG9taW5hbnQsIGNvbG9ycyA9IGMoIiMzNzdFQjgiLCAiIzREQUY0QSIsICIjRTQxQTFDIiksCiAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA0KSwKICAgICAgICAgICAgIHRleHQgPSB+c2hvcnQsCiAgICAgICAgICAgICB0ZXh0Zm9udCA9IGxpc3Qoc2l6ZSA9IDE1KSwKICAgICAgICAgICAgIG1vZGUgPSAidGV4dCttYXJrZXJzIiwKICAgICAgICAgICAgIHNob3dsZWdlbmQgPSBUUlVFKQoKZmlnUzEKYGBgCgojIyMgU3R1ZHkgMiAoNy05eW8pCgpgYGB7ciBmaWd1cmUgM2Qgc2NhdHRlciBzMn0KIyBzZXQgdXAgbGFiZWxzIGZvciBwbG90IChzaG9ydGVuZWQgdmVyc2lvbiBvZiBtZW50YWwgY2FwYWNpdHkgaXRlbXMpCndvcmRpbmdfczIgPC0gbG9hZGluZ3MoZWZhX2QyX2FsbF9yb3RhdGVkTilbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJpdGVtIikgJT4lCiAgc2VsZWN0KGl0ZW0pICU+JQogIG11dGF0ZSh3b3JkaW5nID0gZmFjdG9yKAogICAgcmVjb2RlKGl0ZW0sCiAgICAgICAgICAgaGFwcHkgPSAiZmVlbCBoYXBweSIsCiAgICAgICAgICAgZGVwcmVzc2VkID0gImZlZWwgc2FkIiwKICAgICAgICAgICBmZWFyID0gImZlZWwgc2NhcmVkIiwKICAgICAgICAgICBhbmdyeSA9ICJnZXQgYW5ncnkiLAogICAgICAgICAgIGNhbG0gPSAiZmVlbCBjYWxtIiwKICAgICAgICAgICBzb3VuZHMgPSAiaGVhciBzb3VuZHMiLAogICAgICAgICAgIHNlZWluZyA9ICJzZWUgdGhpbmdzIiwKICAgICAgICAgICB0ZW1wZXJhdHVyZSA9ICJzZW5zZSB0ZW1wZXJhdHVyZXMiLAogICAgICAgICAgIG9kb3JzID0gInNtZWxsIHRoaW5ncyIsCiAgICAgICAgICAgZGVwdGggPSAic2Vuc2Ugd2hldGhlciBzb21ldGhpbmcgaXMgY2xvc2UgYnkgb3IgZmFyIGF3YXkiLAogICAgICAgICAgIGNvbXB1dGF0aW9ucyA9ICJkbyBtYXRoIiwKICAgICAgICAgICB0aG91Z2h0cyA9ICJoYXZlIHRob3VnaHRzIiwKICAgICAgICAgICByZWFzb25pbmcgPSAiZmlndXJlIG91dCBob3cgdG8gZG8gdGhpbmdzIiwKICAgICAgICAgICByZW1lbWJlcmluZyA9ICJyZW1lbWJlciB0aGluZ3MiLAogICAgICAgICAgIGJlbGllZnMgPSAiaGF2ZSBiZWxpZWZzLCBsaWtlIHdoZW4geW91IHRoaW5rIHNvbWV0aGluZyBpcyB0cnVlIiwKICAgICAgICAgICBodW5ncnkgPSAiZ2V0IGh1bmdyeSIsCiAgICAgICAgICAgdGlyZWQgPSAiZmVlbCB0aXJlZCIsCiAgICAgICAgICAgcGFpbiA9ICJmZWVsIHBhaW4iLAogICAgICAgICAgIG5hdXNlYXRlZCA9ICJmZWVsIHNpY2ssIGxpa2Ugd2hlbiB5b3UgZmVlbCBsaWtlIHlvdSBtaWdodCB0aHJvdyB1cCIsCiAgICAgICAgICAgc2FmZSA9ICJmZWVsIHNhZmUiLAogICAgICAgICAgIGxvdmUgPSAiZmVlbCBsb3ZlIiwKICAgICAgICAgICByZWNvZ25pemluZyA9ICJyZWNvZ25pemUgc29tZWJvZHkgZWxzZSIsCiAgICAgICAgICAgY29tbXVuaWNhdGluZyA9ICJjb21tdW5pY2F0ZSB3aXRoIHNvbWVib2R5IGVsc2UiLAogICAgICAgICAgIGd1aWx0ID0gImZlZWwgZ3VpbHR5IiwKICAgICAgICAgICBkaXNyZXNwZWN0ZWQgPSAiZ2V0IGh1cnQgZmVlbGluZ3MiLAogICAgICAgICAgIGZyZWVfd2lsbCA9ICJkZWNpZGUgd2hhdCB0byBkbyIsCiAgICAgICAgICAgY2hvaWNlcyA9ICJtYWtlIGNob2ljZXMiLAogICAgICAgICAgIHNlbGZfcmVzdHJhaW50ID0gImhhdmUgc2VsZi1jb250cm9sLCBsaWtlIHdoZW4geW91IHN0b3AgeW91cnNlbGYgZnJvbSBkb2luZyBzb21ldGhpbmcgeW91IHNob3VsZG4ndCBkbyIsCiAgICAgICAgICAgaW50ZW50aW9ucyA9ICJtYWtlIHBsYW5zIiwKICAgICAgICAgICBnb2FsID0gImhhdmUgZ29hbHMsIGxpa2Ugd2hlbiB5b3UncmUgd29ya2luZyBoYXJkIHRvIGRvIHNvbWV0aGluZyBvciBtYWtlIHNvbWV0aGluZyBoYXBwZW4iLAogICAgICAgICAgIGNvbnNjaW91cyA9ICJiZSBhd2FyZSBvZiB0aGluZ3MiLAogICAgICAgICAgIHNlbGZfYXdhcmUgPSAiYmUgYXdhcmUgb2YgaXRzZWxmIiwKICAgICAgICAgICBkZXNpcmVzID0gImhhdmUgZGVzaXJlcywgbGlrZSB3aGVuIHlvdSByZWFsbHkgd2FudCBzb21ldGhpbmciLAogICAgICAgICAgIGVtYmFycmFzc2VkID0gImZlZWwgZW1iYXJyYXNzZWQiLAogICAgICAgICAgIGVtb19yZWNvZyA9ICJ1bmRlcnN0YW5kIGhvdyBzb21lYm9keSBlbHNlIGlzIGZlZWxpbmciLAogICAgICAgICAgIGpveSA9ICJmZWVsIGpveSIsCiAgICAgICAgICAgbW9yYWxpdHkgPSAia25vdyB3aGF0J3MgbmljZSBhbmQgd2hhdCdzIG1lYW4iLAogICAgICAgICAgIHBlcnNvbmFsaXR5ID0gImhhdmUgYSBwZXJzb25hbGl0eSwgbGlrZSB3aGVuIHNvbWVvbmUgaXMgc2h5IGFuZCBzb21lYm9keSBlbHNlIGlzIHNpbGx5IiwKICAgICAgICAgICBwbGVhc3VyZSA9ICJmZWVsIHBsZWFzdXJlLCBsaWtlIHdoZW4gc29tZXRoaW5nIGZlZWxzIHJlYWxseSBnb29kIiwKICAgICAgICAgICBwcmlkZSA9ICJmZWVsIHByb3VkIikpKSAlPiUKICAgIG11dGF0ZShzaG9ydCA9IGZhY3RvcigKICAgICAgcmVjb2RlKGl0ZW0sCiAgICAgICAgICAgICBoYXBweSA9ICJoYXBweSIsCiAgICAgICAgICAgICBkZXByZXNzZWQgPSAic2FkIiwKICAgICAgICAgICBmZWFyID0gInNjYXJlZCIsCiAgICAgICAgICAgYW5ncnkgPSAiYW5ncnkiLAogICAgICAgICAgIGNhbG0gPSAiY2FsbSIsCiAgICAgICAgICAgc291bmRzID0gImhlYXIiLAogICAgICAgICAgIHNlZWluZyA9ICJzZWUiLAogICAgICAgICAgIHRlbXBlcmF0dXJlID0gInRlbXBlcmF0dXJlcyIsCiAgICAgICAgICAgb2RvcnMgPSAic21lbGwiLAogICAgICAgICAgIGRlcHRoID0gImRlcHRoIiwKICAgICAgICAgICBjb21wdXRhdGlvbnMgPSAibWF0aCIsCiAgICAgICAgICAgdGhvdWdodHMgPSAidGhvdWdodHMiLAogICAgICAgICAgIHJlYXNvbmluZyA9ICJmaWd1cmUgb3V0IiwKICAgICAgICAgICByZW1lbWJlcmluZyA9ICJyZW1lbWJlciIsCiAgICAgICAgICAgYmVsaWVmcyA9ICJiZWxpZWZzIiwKICAgICAgICAgICBodW5ncnkgPSAiaHVuZ3J5IiwKICAgICAgICAgICB0aXJlZCA9ICJ0aXJlZCIsCiAgICAgICAgICAgcGFpbiA9ICJwYWluIiwKICAgICAgICAgICBuYXVzZWF0ZWQgPSAic2ljayIsCiAgICAgICAgICAgc2FmZSA9ICJzYWZlIiwKICAgICAgICAgICBsb3ZlID0gImxvdmUiLAogICAgICAgICAgIHJlY29nbml6aW5nID0gInJlY29nbml6ZSIsCiAgICAgICAgICAgY29tbXVuaWNhdGluZyA9ICJjb21tdW5pY2F0ZSIsCiAgICAgICAgICAgZ3VpbHQgPSAiZ3VpbHR5IiwKICAgICAgICAgICBkaXNyZXNwZWN0ZWQgPSAiaHVydCBmZWVsaW5ncyIsCiAgICAgICAgICAgZnJlZV93aWxsID0gImRlY2lkZSIsCiAgICAgICAgICAgY2hvaWNlcyA9ICJjaG9pY2VzIiwKICAgICAgICAgICBzZWxmX3Jlc3RyYWludCA9ICJzZWxmLWNvbnRyb2wiLAogICAgICAgICAgIGludGVudGlvbnMgPSAicGxhbnMiLAogICAgICAgICAgIGdvYWwgPSAiZ29hbHMiLAogICAgICAgICAgIGNvbnNjaW91cyA9ICJhd2FyZSIsCiAgICAgICAgICAgc2VsZl9hd2FyZSA9ICJzZWxmLWF3YXJlIiwKICAgICAgICAgICBkZXNpcmVzID0gImRlc2lyZXMiLAogICAgICAgICAgIGVtYmFycmFzc2VkID0gImVtYmFycmFzc2VkIiwKICAgICAgICAgICBlbW9fcmVjb2cgPSAiZW1wYXRoeSIsCiAgICAgICAgICAgam95ID0gImpveSIsCiAgICAgICAgICAgbW9yYWxpdHkgPSAibW9yYWxpdHkiLAogICAgICAgICAgIHBlcnNvbmFsaXR5ID0gInBlcnNvbmFsaXR5IiwKICAgICAgICAgICBwbGVhc3VyZSA9ICJwbGVhc3VyZSIsCiAgICAgICAgICAgcHJpZGUgPSAicHJpZGUiKSkpCgojIG1ha2UgZGF0YWZyYW1lIGZvciBwbG90dGluZwpzY2F0dGVyX3Bsb3R0aW5nIDwtIGxvYWRpbmdzKGVmYV9kMl9hbGxfcm90YXRlZE4pW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiaXRlbSIpICU+JQogIHJlbmFtZShCT0RZID0gTVIxLAogICAgICAgICBIRUFSVCA9IE1SMiwKICAgICAgICAgTUlORCA9IE1SMykgJT4lCiAgZnVsbF9qb2luKHdvcmRpbmdfczIpICU+JQogIG11dGF0ZShkb21pbmFudCA9IGZhY3RvcigKICAgIGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoQk9EWSksICJCT0RZIiwKICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKEhFQVJUKSwgIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhNSU5EKSwgIk1JTkQiLAogICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpLAogICAgc2l6ZSA9IGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoQk9EWSksIGFicyhCT0RZKSwKICAgICAgICAgICAgICAgICAgaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhIRUFSVCksIGFicyhIRUFSVCksCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKE1JTkQpLCBhYnMoTUlORCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSksCiAgICBjb2xvciA9IGlmZWxzZShkb21pbmFudCA9PSAiQk9EWSIsICIjRTQxQTFDIiwKICAgICAgICAgICAgICAgICAgIGlmZWxzZShkb21pbmFudCA9PSAiSEVBUlQiLCAiIzREQUY0QSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRvbWluYW50ID09ICJNSU5EIiwgIiNFNDFBMUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkKCiMgcGxvdCEKZmlnUzIgPC0gcGxvdF9seShzY2F0dGVyX3Bsb3R0aW5nLCB4ID0gfkhFQVJULCB5ID0gfkJPRFksIHogPSB+TUlORCwKICAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgIGNvbG9yID0gfmRvbWluYW50LCBjb2xvcnMgPSBjKCIjMzc3RUI4IiwgIiM0REFGNEEiLCAiI0U0MUExQyIpLAogICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gNCksCiAgICAgICAgICAgICB0ZXh0ID0gfnNob3J0LAogICAgICAgICAgICAgdGV4dGZvbnQgPSBsaXN0KHNpemUgPSAxNSksCiAgICAgICAgICAgICBtb2RlID0gInRleHQrbWFya2VycyIsCiAgICAgICAgICAgICBzaG93bGVnZW5kID0gVFJVRSkKCmZpZ1MyCmBgYAoKIyMjIFN0dWR5IDMgKDctOXlvKQoKYGBge3IgZmlndXJlIDNkIHNjYXR0ZXIgczN9CiMgc2V0IHVwIGxhYmVscyBmb3IgcGxvdCAoc2hvcnRlbmVkIHZlcnNpb24gb2YgbWVudGFsIGNhcGFjaXR5IGl0ZW1zKQp3b3JkaW5nX3MzIDwtIGxvYWRpbmdzKGVmYV9kM19hbGxfcm90YXRlZE4pW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiaXRlbSIpICU+JQogIHNlbGVjdChpdGVtKSAlPiUKICBtdXRhdGUod29yZGluZyA9IGZhY3RvcigKICAgIHJlY29kZShpdGVtLAogICAgICAgICAgIGhhcHB5ID0gImZlZWwgaGFwcHkiLAogICAgICAgICAgIGRlcHJlc3NlZCA9ICJmZWVsIHNhZCIsCiAgICAgICAgICAgZmVhciA9ICJmZWVsIHNjYXJlZCIsCiAgICAgICAgICAgYW5ncnkgPSAiZ2V0IGFuZ3J5IiwKICAgICAgICAgICBjYWxtID0gImZlZWwgY2FsbSIsCiAgICAgICAgICAgc291bmRzID0gImhlYXIgc291bmRzIiwKICAgICAgICAgICBzZWVpbmcgPSAic2VlIHRoaW5ncyIsCiAgICAgICAgICAgdGVtcGVyYXR1cmUgPSAic2Vuc2UgdGVtcGVyYXR1cmVzIiwKICAgICAgICAgICBvZG9ycyA9ICJzbWVsbCB0aGluZ3MiLAogICAgICAgICAgICMgZGVwdGggPSAic2Vuc2Ugd2hldGhlciBzb21ldGhpbmcgaXMgY2xvc2UgYnkgb3IgZmFyIGF3YXkiLAogICAgICAgICAgIGRlcHRoID0gInNlbnNlLi4uIGZhciBhd2F5IiwKICAgICAgICAgICBjb21wdXRhdGlvbnMgPSAiZG8gbWF0aCIsCiAgICAgICAgICAgdGhvdWdodHMgPSAiaGF2ZSB0aG91Z2h0cyIsCiAgICAgICAgICAgcmVhc29uaW5nID0gImZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaW5ncyIsCiAgICAgICAgICAgcmVtZW1iZXJpbmcgPSAicmVtZW1iZXIgdGhpbmdzIiwKICAgICAgICAgICAjIGJlbGllZnMgPSAiaGF2ZSBiZWxpZWZzLCBsaWtlIHdoZW4geW91IHRoaW5rIHNvbWV0aGluZyBpcyB0cnVlIiwKICAgICAgICAgICBiZWxpZWZzID0gImhhdmUgYmVsaWVmcy4uLiIsCiAgICAgICAgICAgaHVuZ3J5ID0gImdldCBodW5ncnkiLAogICAgICAgICAgIHRpcmVkID0gImZlZWwgdGlyZWQiLAogICAgICAgICAgIHBhaW4gPSAiZmVlbCBwYWluIiwKICAgICAgICAgICAjIG5hdXNlYXRlZCA9ICJmZWVsIHNpY2ssIGxpa2Ugd2hlbiB5b3UgZmVlbCBsaWtlIHlvdSBtaWdodCB0aHJvdyB1cCIsCiAgICAgICAgICAgbmF1c2VhdGVkID0gImZlZWwgc2ljay4uLiIsCiAgICAgICAgICAgc2FmZSA9ICJmZWVsIHNhZmUiLAogICAgICAgICAgIGxvdmUgPSAiZmVlbCBsb3ZlIiwKICAgICAgICAgICByZWNvZ25pemluZyA9ICJyZWNvZ25pemUgc29tZWJvZHkgZWxzZSIsCiAgICAgICAgICAgY29tbXVuaWNhdGluZyA9ICJjb21tdW5pY2F0ZSB3aXRoIHNvbWVib2R5IGVsc2UiLAogICAgICAgICAgIGd1aWx0ID0gImZlZWwgZ3VpbHR5IiwKICAgICAgICAgICBkaXNyZXNwZWN0ZWQgPSAiZ2V0IGh1cnQgZmVlbGluZ3MiLAogICAgICAgICAgIGZyZWVfd2lsbCA9ICJkZWNpZGUgd2hhdCB0byBkbyIsCiAgICAgICAgICAgY2hvaWNlcyA9ICJtYWtlIGNob2ljZXMiLAogICAgICAgICAgICMgc2VsZl9yZXN0cmFpbnQgPSAiaGF2ZSBzZWxmLWNvbnRyb2wsIGxpa2Ugd2hlbiB5b3Ugc3RvcCB5b3Vyc2VsZiBmcm9tIGRvaW5nIHNvbWV0aGluZyB5b3Ugc2hvdWxkbid0IGRvIiwKICAgICAgICAgICBzZWxmX3Jlc3RyYWludCA9ICJoYXZlIHNlbGYtY29udHJvbC4uLiIsCiAgICAgICAgICAgaW50ZW50aW9ucyA9ICJtYWtlIHBsYW5zIiwKICAgICAgICAgICAjIGdvYWwgPSAiaGF2ZSBnb2FscywgbGlrZSB3aGVuIHlvdSdyZSB3b3JraW5nIGhhcmQgdG8gZG8gc29tZXRoaW5nIG9yIG1ha2Ugc29tZXRoaW5nIGhhcHBlbiIsCiAgICAgICAgICAgZ29hbCA9ICJoYXZlIGdvYWxzLi4uIiwKICAgICAgICAgICBjb25zY2lvdXMgPSAiYmUgYXdhcmUgb2YgdGhpbmdzIiwKICAgICAgICAgICBzZWxmX2F3YXJlID0gImJlIGF3YXJlIG9mIGl0c2VsZiIsCiAgICAgICAgICAgIyBkZXNpcmVzID0gImhhdmUgZGVzaXJlcywgbGlrZSB3aGVuIHlvdSByZWFsbHkgd2FudCBzb21ldGhpbmciLAogICAgICAgICAgIGRlc2lyZXMgPSAiaGF2ZSBkZXNpcmVzLi4uIiwKICAgICAgICAgICBlbWJhcnJhc3NlZCA9ICJmZWVsIGVtYmFycmFzc2VkIiwKICAgICAgICAgICBlbW9fcmVjb2cgPSAidW5kZXJzdGFuZCBob3cgc29tZWJvZHkgZWxzZSBpcyBmZWVsaW5nIiwKICAgICAgICAgICBqb3kgPSAiZmVlbCBqb3kiLAogICAgICAgICAgIG1vcmFsaXR5ID0gImtub3cgd2hhdCdzIG5pY2UgYW5kIHdoYXQncyBtZWFuIiwKICAgICAgICAgICAjIHBlcnNvbmFsaXR5ID0gImhhdmUgYSBwZXJzb25hbGl0eSwgbGlrZSB3aGVuIHNvbWVvbmUgaXMgc2h5IGFuZCBzb21lYm9keSBlbHNlIGlzIHNpbGx5IiwKICAgICAgICAgICBwZXJzb25hbGl0eSA9ICJoYXZlIGEgcGVyc29uYWxpdHkuLi4iLAogICAgICAgICAgICMgcGxlYXN1cmUgPSAiZmVlbCBwbGVhc3VyZSwgbGlrZSB3aGVuIHNvbWV0aGluZyBmZWVscyByZWFsbHkgZ29vZCIsCiAgICAgICAgICAgcGxlYXN1cmUgPSAiZmVlbCBwbGVhc3VyZS4uLiIsCiAgICAgICAgICAgcHJpZGUgPSAiZmVlbCBwcm91ZCIpKSkgJT4lCiAgICBtdXRhdGUoc2hvcnQgPSBmYWN0b3IoCiAgICAgIHJlY29kZShpdGVtLAogICAgICAgICAgICAgaGFwcHkgPSAiaGFwcHkiLAogICAgICAgICAgICAgZGVwcmVzc2VkID0gInNhZCIsCiAgICAgICAgICAgZmVhciA9ICJzY2FyZWQiLAogICAgICAgICAgIGFuZ3J5ID0gImFuZ3J5IiwKICAgICAgICAgICBjYWxtID0gImNhbG0iLAogICAgICAgICAgIHNvdW5kcyA9ICJoZWFyIiwKICAgICAgICAgICBzZWVpbmcgPSAic2VlIiwKICAgICAgICAgICB0ZW1wZXJhdHVyZSA9ICJ0ZW1wZXJhdHVyZXMiLAogICAgICAgICAgIG9kb3JzID0gInNtZWxsIiwKICAgICAgICAgICBkZXB0aCA9ICJkZXB0aCIsCiAgICAgICAgICAgY29tcHV0YXRpb25zID0gIm1hdGgiLAogICAgICAgICAgIHRob3VnaHRzID0gInRob3VnaHRzIiwKICAgICAgICAgICByZWFzb25pbmcgPSAiZmlndXJlIG91dCIsCiAgICAgICAgICAgcmVtZW1iZXJpbmcgPSAicmVtZW1iZXIiLAogICAgICAgICAgIGJlbGllZnMgPSAiYmVsaWVmcyIsCiAgICAgICAgICAgaHVuZ3J5ID0gImh1bmdyeSIsCiAgICAgICAgICAgdGlyZWQgPSAidGlyZWQiLAogICAgICAgICAgIHBhaW4gPSAicGFpbiIsCiAgICAgICAgICAgbmF1c2VhdGVkID0gInNpY2siLAogICAgICAgICAgIHNhZmUgPSAic2FmZSIsCiAgICAgICAgICAgbG92ZSA9ICJsb3ZlIiwKICAgICAgICAgICByZWNvZ25pemluZyA9ICJyZWNvZ25pemUiLAogICAgICAgICAgIGNvbW11bmljYXRpbmcgPSAiY29tbXVuaWNhdGUiLAogICAgICAgICAgIGd1aWx0ID0gImd1aWx0eSIsCiAgICAgICAgICAgZGlzcmVzcGVjdGVkID0gImh1cnQgZmVlbGluZ3MiLAogICAgICAgICAgIGZyZWVfd2lsbCA9ICJkZWNpZGUiLAogICAgICAgICAgIGNob2ljZXMgPSAiY2hvaWNlcyIsCiAgICAgICAgICAgc2VsZl9yZXN0cmFpbnQgPSAic2VsZi1jb250cm9sIiwKICAgICAgICAgICBpbnRlbnRpb25zID0gInBsYW5zIiwKICAgICAgICAgICBnb2FsID0gImdvYWxzIiwKICAgICAgICAgICBjb25zY2lvdXMgPSAiYXdhcmUiLAogICAgICAgICAgIHNlbGZfYXdhcmUgPSAic2VsZi1hd2FyZSIsCiAgICAgICAgICAgZGVzaXJlcyA9ICJkZXNpcmVzIiwKICAgICAgICAgICBlbWJhcnJhc3NlZCA9ICJlbWJhcnJhc3NlZCIsCiAgICAgICAgICAgZW1vX3JlY29nID0gImVtcGF0aHkiLAogICAgICAgICAgIGpveSA9ICJqb3kiLAogICAgICAgICAgIG1vcmFsaXR5ID0gIm1vcmFsaXR5IiwKICAgICAgICAgICBwZXJzb25hbGl0eSA9ICJwZXJzb25hbGl0eSIsCiAgICAgICAgICAgcGxlYXN1cmUgPSAicGxlYXN1cmUiLAogICAgICAgICAgIHByaWRlID0gInByaWRlIikpKQoKIyBtYWtlIGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcKc2NhdHRlcl9wbG90dGluZyA8LSBsb2FkaW5ncyhlZmFfZDNfYWxsX3JvdGF0ZWROKVtdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIml0ZW0iKSAlPiUKICByZW5hbWUoQk9EWSA9IE1SMSwKICAgICAgICAgSEVBUlQgPSBNUjIsCiAgICAgICAgIE1JTkQgPSBNUjMpICU+JQogIGZ1bGxfam9pbih3b3JkaW5nX3MzKSAlPiUKICBtdXRhdGUoZG9taW5hbnQgPSBmYWN0b3IoCiAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKEJPRFkpLCAiQk9EWSIsCiAgICAgICAgICAgaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhIRUFSVCksICJIRUFSVCIsCiAgICAgICAgICAgICAgICAgIGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoTUlORCksICJNSU5EIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKSwKICAgIHNpemUgPSBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKEJPRFkpLCBhYnMoQk9EWSksCiAgICAgICAgICAgICAgICAgIGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoSEVBUlQpLCBhYnMoSEVBUlQpLAogICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhNSU5EKSwgYWJzKE1JTkQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpLAogICAgY29sb3IgPSBpZmVsc2UoZG9taW5hbnQgPT0gIkJPRFkiLCAiI0U0MUExQyIsCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoZG9taW5hbnQgPT0gIkhFQVJUIiwgIiM0REFGNEEiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkb21pbmFudCA9PSAiTUlORCIsICIjRTQxQTFDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpCgojIHBsb3QhCmZpZ3MzIDwtIHBsb3RfbHkoc2NhdHRlcl9wbG90dGluZywgeCA9IH5IRUFSVCwgeSA9IH5CT0RZLCB6ID0gfk1JTkQsCiAgICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgICBjb2xvciA9IH5kb21pbmFudCwgY29sb3JzID0gYygiIzM3N0VCOCIsICIjNERBRjRBIiwgIiNFNDFBMUMiKSwKICAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDQpLAogICAgICAgICAgICAgdGV4dCA9IH5zaG9ydCwKICAgICAgICAgICAgIHRleHRmb250ID0gbGlzdChzaXplID0gMTUpLAogICAgICAgICAgICAgbW9kZSA9ICJ0ZXh0K21hcmtlcnMiLAogICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IFRSVUUpCgpmaWdzMwpgYGAKCiMjIyBTdHVkeSA0ICg0LTZ5bykKCmBgYHtyIGZpZ3VyZSAzZCBzY2F0dGVyIHM0fQojIHNldCB1cCBsYWJlbHMgZm9yIHBsb3QgKHNob3J0ZW5lZCB2ZXJzaW9uIG9mIG1lbnRhbCBjYXBhY2l0eSBpdGVtcykKd29yZGluZ19zNCA8LSBsb2FkaW5ncyhlZmFfZDRfYWxsX3JvdGF0ZWROKVtdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIml0ZW0iKSAlPiUKICBzZWxlY3QoaXRlbSkgJT4lCiAgbXV0YXRlKHdvcmRpbmcgPSBmYWN0b3IoCiAgICByZWNvZGUoaXRlbSwKICAgICAgICAgICBoYXBweSA9ICJmZWVsIGhhcHB5IiwKICAgICAgICAgICBkZXByZXNzZWQgPSAiZmVlbCBzYWQiLAogICAgICAgICAgIGZlYXIgPSAiZmVlbCBzY2FyZWQiLAogICAgICAgICAgIGFuZ3J5ID0gImdldCBhbmdyeSIsCiAgICAgICAgICAgY2FsbSA9ICJmZWVsIGNhbG0iLAogICAgICAgICAgIHNvdW5kcyA9ICJoZWFyIHNvdW5kcyIsCiAgICAgICAgICAgc2VlaW5nID0gInNlZSB0aGluZ3MiLAogICAgICAgICAgIHRlbXBlcmF0dXJlID0gInNlbnNlIHRlbXBlcmF0dXJlcyIsCiAgICAgICAgICAgb2RvcnMgPSAic21lbGwgdGhpbmdzIiwKICAgICAgICAgICAjIGRlcHRoID0gInNlbnNlIHdoZXRoZXIgc29tZXRoaW5nIGlzIGNsb3NlIGJ5IG9yIGZhciBhd2F5IiwKICAgICAgICAgICBkZXB0aCA9ICJzZW5zZS4uLiBmYXIgYXdheSIsCiAgICAgICAgICAgY29tcHV0YXRpb25zID0gImRvIG1hdGgiLAogICAgICAgICAgIHRob3VnaHRzID0gImhhdmUgdGhvdWdodHMiLAogICAgICAgICAgIHJlYXNvbmluZyA9ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MiLAogICAgICAgICAgIHJlbWVtYmVyaW5nID0gInJlbWVtYmVyIHRoaW5ncyIsCiAgICAgICAgICAgIyBiZWxpZWZzID0gImhhdmUgYmVsaWVmcywgbGlrZSB3aGVuIHlvdSB0aGluayBzb21ldGhpbmcgaXMgdHJ1ZSIsCiAgICAgICAgICAgYmVsaWVmcyA9ICJoYXZlIGJlbGllZnMuLi4iLAogICAgICAgICAgIGh1bmdyeSA9ICJnZXQgaHVuZ3J5IiwKICAgICAgICAgICB0aXJlZCA9ICJmZWVsIHRpcmVkIiwKICAgICAgICAgICBwYWluID0gImZlZWwgcGFpbiIsCiAgICAgICAgICAgIyBuYXVzZWF0ZWQgPSAiZmVlbCBzaWNrLCBsaWtlIHdoZW4geW91IGZlZWwgbGlrZSB5b3UgbWlnaHQgdGhyb3cgdXAiLAogICAgICAgICAgIG5hdXNlYXRlZCA9ICJmZWVsIHNpY2suLi4iLAogICAgICAgICAgIHNhZmUgPSAiZmVlbCBzYWZlIiwKICAgICAgICAgICBsb3ZlID0gImZlZWwgbG92ZSIsCiAgICAgICAgICAgcmVjb2duaXppbmcgPSAicmVjb2duaXplIHNvbWVib2R5IGVsc2UiLAogICAgICAgICAgIGNvbW11bmljYXRpbmcgPSAiY29tbXVuaWNhdGUgd2l0aCBzb21lYm9keSBlbHNlIiwKICAgICAgICAgICBndWlsdCA9ICJmZWVsIGd1aWx0eSIsCiAgICAgICAgICAgZGlzcmVzcGVjdGVkID0gImdldCBodXJ0IGZlZWxpbmdzIiwKICAgICAgICAgICBmcmVlX3dpbGwgPSAiZGVjaWRlIHdoYXQgdG8gZG8iLAogICAgICAgICAgIGNob2ljZXMgPSAibWFrZSBjaG9pY2VzIiwKICAgICAgICAgICAjIHNlbGZfcmVzdHJhaW50ID0gImhhdmUgc2VsZi1jb250cm9sLCBsaWtlIHdoZW4geW91IHN0b3AgeW91cnNlbGYgZnJvbSBkb2luZyBzb21ldGhpbmcgeW91IHNob3VsZG4ndCBkbyIsCiAgICAgICAgICAgc2VsZl9yZXN0cmFpbnQgPSAiaGF2ZSBzZWxmLWNvbnRyb2wuLi4iLAogICAgICAgICAgIGludGVudGlvbnMgPSAibWFrZSBwbGFucyIsCiAgICAgICAgICAgIyBnb2FsID0gImhhdmUgZ29hbHMsIGxpa2Ugd2hlbiB5b3UncmUgd29ya2luZyBoYXJkIHRvIGRvIHNvbWV0aGluZyBvciBtYWtlIHNvbWV0aGluZyBoYXBwZW4iLAogICAgICAgICAgIGdvYWwgPSAiaGF2ZSBnb2Fscy4uLiIsCiAgICAgICAgICAgY29uc2Npb3VzID0gImJlIGF3YXJlIG9mIHRoaW5ncyIsCiAgICAgICAgICAgc2VsZl9hd2FyZSA9ICJiZSBhd2FyZSBvZiBpdHNlbGYiLAogICAgICAgICAgICMgZGVzaXJlcyA9ICJoYXZlIGRlc2lyZXMsIGxpa2Ugd2hlbiB5b3UgcmVhbGx5IHdhbnQgc29tZXRoaW5nIiwKICAgICAgICAgICBkZXNpcmVzID0gImhhdmUgZGVzaXJlcy4uLiIsCiAgICAgICAgICAgZW1iYXJyYXNzZWQgPSAiZmVlbCBlbWJhcnJhc3NlZCIsCiAgICAgICAgICAgZW1vX3JlY29nID0gInVuZGVyc3RhbmQgaG93IHNvbWVib2R5IGVsc2UgaXMgZmVlbGluZyIsCiAgICAgICAgICAgam95ID0gImZlZWwgam95IiwKICAgICAgICAgICBtb3JhbGl0eSA9ICJrbm93IHdoYXQncyBuaWNlIGFuZCB3aGF0J3MgbWVhbiIsCiAgICAgICAgICAgIyBwZXJzb25hbGl0eSA9ICJoYXZlIGEgcGVyc29uYWxpdHksIGxpa2Ugd2hlbiBzb21lb25lIGlzIHNoeSBhbmQgc29tZWJvZHkgZWxzZSBpcyBzaWxseSIsCiAgICAgICAgICAgcGVyc29uYWxpdHkgPSAiaGF2ZSBhIHBlcnNvbmFsaXR5Li4uIiwKICAgICAgICAgICAjIHBsZWFzdXJlID0gImZlZWwgcGxlYXN1cmUsIGxpa2Ugd2hlbiBzb21ldGhpbmcgZmVlbHMgcmVhbGx5IGdvb2QiLAogICAgICAgICAgIHBsZWFzdXJlID0gImZlZWwgcGxlYXN1cmUuLi4iLAogICAgICAgICAgIHByaWRlID0gImZlZWwgcHJvdWQiKSkpICU+JQogICAgbXV0YXRlKHNob3J0ID0gZmFjdG9yKAogICAgICByZWNvZGUoaXRlbSwKICAgICAgICAgICAgIGhhcHB5ID0gImhhcHB5IiwKICAgICAgICAgICAgIGRlcHJlc3NlZCA9ICJzYWQiLAogICAgICAgICAgIGZlYXIgPSAic2NhcmVkIiwKICAgICAgICAgICBhbmdyeSA9ICJhbmdyeSIsCiAgICAgICAgICAgY2FsbSA9ICJjYWxtIiwKICAgICAgICAgICBzb3VuZHMgPSAiaGVhciIsCiAgICAgICAgICAgc2VlaW5nID0gInNlZSIsCiAgICAgICAgICAgdGVtcGVyYXR1cmUgPSAidGVtcGVyYXR1cmVzIiwKICAgICAgICAgICBvZG9ycyA9ICJzbWVsbCIsCiAgICAgICAgICAgZGVwdGggPSAiZGVwdGgiLAogICAgICAgICAgIGNvbXB1dGF0aW9ucyA9ICJtYXRoIiwKICAgICAgICAgICB0aG91Z2h0cyA9ICJ0aG91Z2h0cyIsCiAgICAgICAgICAgcmVhc29uaW5nID0gImZpZ3VyZSBvdXQiLAogICAgICAgICAgIHJlbWVtYmVyaW5nID0gInJlbWVtYmVyIiwKICAgICAgICAgICBiZWxpZWZzID0gImJlbGllZnMiLAogICAgICAgICAgIGh1bmdyeSA9ICJodW5ncnkiLAogICAgICAgICAgIHRpcmVkID0gInRpcmVkIiwKICAgICAgICAgICBwYWluID0gInBhaW4iLAogICAgICAgICAgIG5hdXNlYXRlZCA9ICJzaWNrIiwKICAgICAgICAgICBzYWZlID0gInNhZmUiLAogICAgICAgICAgIGxvdmUgPSAibG92ZSIsCiAgICAgICAgICAgcmVjb2duaXppbmcgPSAicmVjb2duaXplIiwKICAgICAgICAgICBjb21tdW5pY2F0aW5nID0gImNvbW11bmljYXRlIiwKICAgICAgICAgICBndWlsdCA9ICJndWlsdHkiLAogICAgICAgICAgIGRpc3Jlc3BlY3RlZCA9ICJodXJ0IGZlZWxpbmdzIiwKICAgICAgICAgICBmcmVlX3dpbGwgPSAiZGVjaWRlIiwKICAgICAgICAgICBjaG9pY2VzID0gImNob2ljZXMiLAogICAgICAgICAgIHNlbGZfcmVzdHJhaW50ID0gInNlbGYtY29udHJvbCIsCiAgICAgICAgICAgaW50ZW50aW9ucyA9ICJwbGFucyIsCiAgICAgICAgICAgZ29hbCA9ICJnb2FscyIsCiAgICAgICAgICAgY29uc2Npb3VzID0gImF3YXJlIiwKICAgICAgICAgICBzZWxmX2F3YXJlID0gInNlbGYtYXdhcmUiLAogICAgICAgICAgIGRlc2lyZXMgPSAiZGVzaXJlcyIsCiAgICAgICAgICAgZW1iYXJyYXNzZWQgPSAiZW1iYXJyYXNzZWQiLAogICAgICAgICAgIGVtb19yZWNvZyA9ICJlbXBhdGh5IiwKICAgICAgICAgICBqb3kgPSAiam95IiwKICAgICAgICAgICBtb3JhbGl0eSA9ICJtb3JhbGl0eSIsCiAgICAgICAgICAgcGVyc29uYWxpdHkgPSAicGVyc29uYWxpdHkiLAogICAgICAgICAgIHBsZWFzdXJlID0gInBsZWFzdXJlIiwKICAgICAgICAgICBwcmlkZSA9ICJwcmlkZSIpKSkKCiMgIyBtYWtlIGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcKIyBzY2F0dGVyX3Bsb3R0aW5nIDwtIGxvYWRpbmdzKGVmYV9kNF9hbGxfcm90YXRlZE4pW10gJT4lCiMgICBkYXRhLmZyYW1lKCkgJT4lCiMgICByb3duYW1lc190b19jb2x1bW4odmFyID0gIml0ZW0iKSAlPiUKIyAgIHJlbmFtZShCT0RZID0gTVIxLAojICAgICAgICAgIEhFQVJUID0gTVIyLAojICAgICAgICAgIE1JTkQgPSBNUjMpICU+JQojICAgZnVsbF9qb2luKHdvcmRpbmdfczQpICU+JQojICAgbXV0YXRlKGRvbWluYW50ID0gZmFjdG9yKAojICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKEJPRFkpLCAiQk9EWSIsCiMgICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKEhFQVJUKSwgIkhFQVJUIiwKIyAgICAgICAgICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKE1JTkQpLCAiTUlORCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKSwKIyAgICAgc2l6ZSA9IGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoQk9EWSksIGFicyhCT0RZKSwKIyAgICAgICAgICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKEhFQVJUKSwgYWJzKEhFQVJUKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhNSU5EKSwgYWJzKE1JTkQpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSksCiMgICAgIGNvbG9yID0gaWZlbHNlKGRvbWluYW50ID09ICJCT0RZIiwgIiNFNDFBMUMiLAojICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZG9taW5hbnQgPT0gIkhFQVJUIiwgIiM0REFGNEEiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRvbWluYW50ID09ICJNSU5EIiwgIiNFNDFBMUMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKQojIAojICMgcGxvdCEKIyBmaWdzNCA8LSBwbG90X2x5KHNjYXR0ZXJfcGxvdHRpbmcsIHggPSB+SEVBUlQsIHkgPSB+Qk9EWSwgeiA9IH5NSU5ELAojICAgICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiMgICAgICAgICAgICAgIGNvbG9yID0gfmRvbWluYW50LCBjb2xvcnMgPSBjKCIjMzc3RUI4IiwgIiM0REFGNEEiLCAiI0U0MUExQyIpLAojICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA0KSwKIyAgICAgICAgICAgICAgdGV4dCA9IH5zaG9ydCwKIyAgICAgICAgICAgICAgdGV4dGZvbnQgPSBsaXN0KHNpemUgPSAxNSksCiMgICAgICAgICAgICAgIG1vZGUgPSAidGV4dCttYXJrZXJzIiwKIyAgICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IFRSVUUpCiMgCiMgZmlnczQKYGBgCgojIyBIZWF0bWFwcwoKKk5PVEU6IHNldCB0byAzIGZhY3RvcnMgbWFudWFsbHksIGZvciBub3cuKgoKIyMjIFN0dWR5IDEgKGFkdWx0cykKCmBgYHtyIGZpZ3VyZSBoZWF0bWFwIHMxLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gN30KZmFjdG9yc19zMSA8LSBmYS5zb3J0KGZhKGQxX2FsbCwgbmZhY3RvcnMgPSAzLCBjb3IgPSBjaG9zZW5Db3JUeXBlLCByb3RhdGUgPSBjaG9zZW5Sb3RUeXBlKSRsb2FkaW5nc1tdKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJpdGVtIikgJT4lCiAgZnVsbF9qb2luKHdvcmRpbmdfczEpICU+JQogIHNlbGVjdCh3b3JkaW5nLCBNUjEsIE1SMiwgTVIzKSAlPiUKICByZW5hbWUoY2FwYWNpdHkgPSB3b3JkaW5nLCBGYWN0b3IxID0gTVIxLCBGYWN0b3IyID0gTVIyLCBGYWN0b3IzID0gTVIzKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIm9yZGVyIikgJT4lCiAgbXV0YXRlKG9yZGVyID0gYXMubnVtZXJpYyhvcmRlcikpCgpmYWN0b3JzX3MxX2xvbmcgPC0gZmFjdG9yc19zMSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHksIC1vcmRlcikgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3Rvcihnc3ViKCJGYWN0b3IiLCAiRiIsIGZhY3RvcikpKSAlPiUKICAjIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZ3N1YigiRmFjdG9yIiwgIkYiLCBmYWN0b3IpLAogICMgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJGMSIsICJGMyIsICJGMiIpKSkgJT4lCiAgIyBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGdzdWIoIkZhY3RvciIsICJGIiwgZmFjdG9yKSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiRjIiLCAiRjEiLCAiRjMiKSkpICU+JQogIGFycmFuZ2Uob3JkZXIsIGZhY3RvcikKCmZhY3RvcnNfczFfYmxhbmsxIDwtIGZhY3RvcnNfczFfbG9uZyAlPiUKICBtdXRhdGUobG9hZGluZyA9IHJlcCgxMDAsIGxlbmd0aChmYWN0b3JzX3MxX2xvbmckbG9hZGluZykpKQojIGZhY3RvcnNfczFfYmxhbmsyIDwtIGZhY3RvcnNfczFfbG9uZyAlPiUKIyAgIG11dGF0ZShsb2FkaW5nID0gaWZlbHNlKGZhY3RvciA9PSAiRjEiLCBsb2FkaW5nLCByZXAoMTAwLCBsZW5ndGgoZmFjdG9yc19zMV9sb25nJGxvYWRpbmcpKjIvMykpKQpmYWN0b3JzX3MxX2JsYW5rMiA8LSBmYWN0b3JzX3MxX2xvbmcgJT4lCiAgbXV0YXRlKGxvYWRpbmcgPSBpZmVsc2UoZmFjdG9yID09ICJGMiIsIGxvYWRpbmcsIHJlcCgxMDAsIGxlbmd0aChmYWN0b3JzX3MxX2xvbmckbG9hZGluZykqMi8zKSkpCmZhY3RvcnNfczFfYmxhbmszIDwtIGZhY3RvcnNfczFfbG9uZyAlPiUKICBtdXRhdGUobG9hZGluZyA9IGlmZWxzZShmYWN0b3IgIT0gIkYzIiwgbG9hZGluZywgcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczFfbG9uZyRsb2FkaW5nKSoxLzMpKSkKCiMgZ2dwbG90KGZhY3RvcnNfczFfYmxhbmsxLCBhZXMoeCA9IGZhY3RvciwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2Mob3JkZXIpKSwgZmlsbCA9IGxvYWRpbmcpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKIyAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwojICAgdGhlbWVfbWluaW1hbCgpICsKIyAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgIyAxMDAwIGJ5IDEwMDAKIyAKIyBnZ3Bsb3QoZmFjdG9yc19zMV9ibGFuazIsIGFlcyh4ID0gZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwojICAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwojICAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSkpICsKIyAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksIGJyZWFrcyA9IGMoLTEsIDAsIDEpLAojICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMjApKSArCiMgICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKIyAgIHRoZW1lX21pbmltYWwoKSArCiMgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiMgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICMgMTAwMCBieSAxMDAwCiMgCiMgZ2dwbG90KGZhY3RvcnNfczFfYmxhbmszLCBhZXMoeCA9IGZhY3RvciwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhvcmRlcikpLCBmaWxsID0gbG9hZGluZykpICsKIyAgIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKIyAgICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpKSArCiMgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLCBicmVha3MgPSBjKC0xLCAwLCAxKSwKIyAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwojICAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiMgICB0aGVtZV9taW5pbWFsKCkgKwojICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMAoKZ2dwbG90KGZhY3RvcnNfczFfbG9uZywgYWVzKHggPSBmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhvcmRlcikpLCBmaWxsID0gbG9hZGluZykpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpLCBzaXplID0gNikgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksIGJyZWFrcyA9IGMoLTEsIDAsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKICAjIGdlb21fcmVjdChhZXMoeG1pbiA9IDAuNTEsIHhtYXggPSAxLjQ5LCB5bWluID0gMTQuNTUsIHltYXggPSAyMC40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMS41MSwgeG1heCA9IDIuNDksIHltaW4gPSA2LjU1LCB5bWF4ID0gMTQuNDUpLAogICMgICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gLjUpICsKICAjIGdlb21fcmVjdChhZXMoeG1pbiA9IDIuNTEsIHhtYXggPSAzLjQ5LCB5bWluID0gMC41NSwgeW1heCA9IDYuNDUpLAogICMgICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gLjUpICsKICAjIHRoZW1lX2J3KCkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMApgYGAKCiMjIyBTdHVkeSAyICg3LTl5KQoKYGBge3IgZmlndXJlIGhlYXRtYXAgczIsIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA3fQpmYWN0b3JzX3MyIDwtIGZhLnNvcnQoZmEoZDJfYWxsLCBuZmFjdG9ycyA9IDMsIGNvciA9IGNob3NlbkNvclR5cGUsIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUpJGxvYWRpbmdzW10pICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIml0ZW0iKSAlPiUKICBmdWxsX2pvaW4od29yZGluZ19zMikgJT4lCiAgc2VsZWN0KHdvcmRpbmcsIE1SMSwgTVIyLCBNUjMpICU+JQogIHJlbmFtZShjYXBhY2l0eSA9IHdvcmRpbmcsIEZhY3RvcjEgPSBNUjEsIEZhY3RvcjIgPSBNUjIsIEZhY3RvcjMgPSBNUjMpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAib3JkZXIiKSAlPiUKICBtdXRhdGUob3JkZXIgPSBhcy5udW1lcmljKG9yZGVyKSkKCmZhY3RvcnNfczJfbG9uZyA8LSBmYWN0b3JzX3MyICU+JQogIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSwgLW9yZGVyKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGdzdWIoIkZhY3RvciIsICJGIiwgZmFjdG9yKSkpICU+JQogICMgbXV0YXRlKGZhY3RvciA9IGZhY3Rvcihnc3ViKCJGYWN0b3IiLCAiRiIsIGZhY3RvciksCiAgIyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkYxIiwgIkYzIiwgIkYyIikpKSAlPiUKICAjIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZ3N1YigiRmFjdG9yIiwgIkYiLCBmYWN0b3IpLAogICMgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJGMiIsICJGMSIsICJGMyIpKSkgJT4lCiAgYXJyYW5nZShvcmRlciwgZmFjdG9yKQoKZmFjdG9yc19zMl9ibGFuazEgPC0gZmFjdG9yc19zMl9sb25nICU+JQogIG11dGF0ZShsb2FkaW5nID0gcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczJfbG9uZyRsb2FkaW5nKSkpCmZhY3RvcnNfczJfYmxhbmsyIDwtIGZhY3RvcnNfczJfbG9uZyAlPiUKICBtdXRhdGUobG9hZGluZyA9IGlmZWxzZShmYWN0b3IgPT0gIkYxIiwgbG9hZGluZywgcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczJfbG9uZyRsb2FkaW5nKSoyLzMpKSkKIyBmYWN0b3JzX3MyX2JsYW5rMiA8LSBmYWN0b3JzX3MyX2xvbmcgJT4lCiMgICBtdXRhdGUobG9hZGluZyA9IGlmZWxzZShmYWN0b3IgPT0gIkYyIiwgbG9hZGluZywgcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczJfbG9uZyRsb2FkaW5nKSoyLzMpKSkKZmFjdG9yc19zMl9ibGFuazMgPC0gZmFjdG9yc19zMl9sb25nICU+JQogIG11dGF0ZShsb2FkaW5nID0gaWZlbHNlKGZhY3RvciAhPSAiRjMiLCBsb2FkaW5nLCByZXAoMTAwLCBsZW5ndGgoZmFjdG9yc19zMl9sb25nJGxvYWRpbmcpKjEvMykpKQoKIyBnZ3Bsb3QoZmFjdG9yc19zMl9ibGFuazEsIGFlcyh4ID0gZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhvcmRlcikpLCBmaWxsID0gbG9hZGluZykpICsKIyAgIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKIyAgICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpKSArCiMgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLCBicmVha3MgPSBjKC0xLCAwLCAxKSwKIyAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwojICAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiMgICB0aGVtZV9taW5pbWFsKCkgKwojICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMAojIAojIGdncGxvdChmYWN0b3JzX3MyX2JsYW5rMiwgYWVzKHggPSBmYWN0b3IsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2Mob3JkZXIpKSwgZmlsbCA9IGxvYWRpbmcpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKIyAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwojICAgdGhlbWVfbWluaW1hbCgpICsKIyAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgIyAxMDAwIGJ5IDEwMDAKIyAKIyBnZ3Bsb3QoZmFjdG9yc19zMl9ibGFuazMsIGFlcyh4ID0gZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwojICAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwojICAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSkpICsKIyAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksIGJyZWFrcyA9IGMoLTEsIDAsIDEpLAojICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMjApKSArCiMgICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKIyAgIHRoZW1lX21pbmltYWwoKSArCiMgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiMgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICMgMTAwMCBieSAxMDAwCgpnZ3Bsb3QoZmFjdG9yc19zMl9sb25nLCBhZXMoeCA9IGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSksIHNpemUgPSA2KSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMC41MSwgeG1heCA9IDEuNDksIHltaW4gPSAxNC41NSwgeW1heCA9IDIwLjQ1KSwKICAjICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IC41KSArCiAgIyBnZW9tX3JlY3QoYWVzKHhtaW4gPSAxLjUxLCB4bWF4ID0gMi40OSwgeW1pbiA9IDYuNTUsIHltYXggPSAxNC40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMi41MSwgeG1heCA9IDMuNDksIHltaW4gPSAwLjU1LCB5bWF4ID0gNi40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgdGhlbWVfYncoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICMgMTAwMCBieSAxMDAwCmBgYAoKIyMjIFN0dWR5IDMgKDctOXkpCgpgYGB7ciBmaWd1cmUgaGVhdG1hcCBzMywgZmlnLndpZHRoID0gNCwgZmlnLmhlaWdodCA9IDd9CmZhY3RvcnNfczMgPC0gZmEuc29ydChmYShkM19hbGwsIG5mYWN0b3JzID0gMywgY29yID0gY2hvc2VuQ29yVHlwZSwgcm90YXRlID0gY2hvc2VuUm90VHlwZSkkbG9hZGluZ3NbXSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiaXRlbSIpICU+JQogIGxlZnRfam9pbihjaGFyX3Bsb3R0aW5nX3dvcmRpbmdzLCBieSA9IGMoIml0ZW0iID0gImNhcGFjaXR5IikpICU+JQogIHNlbGVjdCh3b3JkaW5nLCBNUjEsIE1SMiwgTVIzKSAlPiUKICByZW5hbWUoY2FwYWNpdHkgPSB3b3JkaW5nLCBGYWN0b3IxID0gTVIxLCBGYWN0b3IyID0gTVIyLCBGYWN0b3IzID0gTVIzKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIm9yZGVyIikgJT4lCiAgbXV0YXRlKG9yZGVyID0gYXMubnVtZXJpYyhvcmRlcikpCgpmYWN0b3JzX3MzX2xvbmcgPC0gZmFjdG9yc19zMyAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHksIC1vcmRlcikgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3Rvcihnc3ViKCJGYWN0b3IiLCAiRiIsIGZhY3RvcikpKSAlPiUKICAjIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZ3N1YigiRmFjdG9yIiwgIkYiLCBmYWN0b3IpLAogICMgIyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkYxIiwgIkYzIiwgIkYyIikpKSAlPiUKICAjIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZ3N1YigiRmFjdG9yIiwgIkYiLCBmYWN0b3IpLAogICMgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJGMiIsICJGMSIsICJGMyIpKSkgJT4lCiAgYXJyYW5nZShvcmRlciwgZmFjdG9yKQoKZmFjdG9yc19zM19ibGFuazEgPC0gZmFjdG9yc19zM19sb25nICU+JQogIG11dGF0ZShsb2FkaW5nID0gcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczNfbG9uZyRsb2FkaW5nKSkpCiMgZmFjdG9yc19zM19ibGFuazIgPC0gZmFjdG9yc19zM19sb25nICU+JQojICAgbXV0YXRlKGxvYWRpbmcgPSBpZmVsc2UoZmFjdG9yID09ICJGMSIsIGxvYWRpbmcsIHJlcCgxMDAsIGxlbmd0aChmYWN0b3JzX3MzX2xvbmckbG9hZGluZykqMi8zKSkpCmZhY3RvcnNfczNfYmxhbmsyIDwtIGZhY3RvcnNfczNfbG9uZyAlPiUKICBtdXRhdGUobG9hZGluZyA9IGlmZWxzZShmYWN0b3IgPT0gIkYyIiwgbG9hZGluZywgcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczNfbG9uZyRsb2FkaW5nKSoyLzMpKSkKZmFjdG9yc19zM19ibGFuazMgPC0gZmFjdG9yc19zM19sb25nICU+JQogIG11dGF0ZShsb2FkaW5nID0gaWZlbHNlKGZhY3RvciAhPSAiRjMiLCBsb2FkaW5nLCByZXAoMTAwLCBsZW5ndGgoZmFjdG9yc19zM19sb25nJGxvYWRpbmcpKjEvMykpKQoKIyBnZ3Bsb3QoZmFjdG9yc19zM19ibGFuazEsIGFlcyh4ID0gZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhvcmRlcikpLCBmaWxsID0gbG9hZGluZykpICsKIyAgIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKIyAgICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpKSArCiMgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLCBicmVha3MgPSBjKC0xLCAwLCAxKSwKIyAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwojICAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiMgICB0aGVtZV9taW5pbWFsKCkgKwojICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMAojIAojIGdncGxvdChmYWN0b3JzX3MzX2JsYW5rMiwgYWVzKHggPSBmYWN0b3IsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2Mob3JkZXIpKSwgZmlsbCA9IGxvYWRpbmcpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKIyAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwojICAgdGhlbWVfbWluaW1hbCgpICsKIyAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgIyAxMDAwIGJ5IDEwMDAKIyAKIyBnZ3Bsb3QoZmFjdG9yc19zM19ibGFuazMsIGFlcyh4ID0gZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwojICAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwojICAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSkpICsKIyAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksIGJyZWFrcyA9IGMoLTEsIDAsIDEpLAojICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMjApKSArCiMgICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKIyAgIHRoZW1lX21pbmltYWwoKSArCiMgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiMgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICMgMTAwMCBieSAxMDAwCgpnZ3Bsb3QoZmFjdG9yc19zM19sb25nLCBhZXMoeCA9IGZhY3RvcihmYWN0b3IsIGxhYmVscyA9IGMoIkJvZHkiLCAiTWluZCIsICJIZWFydCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSksIHNpemUgPSA2KSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMC41MSwgeG1heCA9IDEuNDksIHltaW4gPSAxNC41NSwgeW1heCA9IDIwLjQ1KSwKICAjICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IC41KSArCiAgIyBnZW9tX3JlY3QoYWVzKHhtaW4gPSAxLjUxLCB4bWF4ID0gMi40OSwgeW1pbiA9IDYuNTUsIHltYXggPSAxNC40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMi41MSwgeG1heCA9IDMuNDksIHltaW4gPSAwLjU1LCB5bWF4ID0gNi40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgdGhlbWVfYncoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiU3R1ZHkgMiAoNy05eSkiKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMApgYGAKCiMjIyBTdHVkeSA0ICg0LTZ5KQoKYGBge3IgZmlndXJlIGhlYXRtYXAgczQsIGZpZy53aWR0aCA9IDQsIGZpZy5oZWlnaHQgPSA3fQpmYWN0b3JzX3M0IDwtIGZhLnNvcnQoZmEoZDRfYWxsLCBuZmFjdG9ycyA9IG5mYWN0b3JzX2Q0X2FsbCwgY29yID0gY2hvc2VuQ29yVHlwZSwgcm90YXRlID0gY2hvc2VuUm90VHlwZSkkbG9hZGluZ3NbXSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiaXRlbSIpICU+JQogIGxlZnRfam9pbihjaGFyX3Bsb3R0aW5nX3dvcmRpbmdzLCBieSA9IGMoIml0ZW0iID0gImNhcGFjaXR5IikpICU+JQogIHNlbGVjdCh3b3JkaW5nLCBzdGFydHNfd2l0aCgiTVIiKSkgJT4lCiAgcmVuYW1lKGNhcGFjaXR5ID0gd29yZGluZywgRmFjdG9yMSA9IE1SMSwgRmFjdG9yMiA9IE1SMikgJT4lICMsIEZhY3RvcjMgPSBNUjMpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAib3JkZXIiKSAlPiUKICBtdXRhdGUob3JkZXIgPSBhcy5udW1lcmljKG9yZGVyKSkKCmZhY3RvcnNfczRfbG9uZyA8LSBmYWN0b3JzX3M0ICU+JQogIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSwgLW9yZGVyKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGdzdWIoIkZhY3RvciIsICJGIiwgZmFjdG9yKSkpICU+JQogICMgbXV0YXRlKGZhY3RvciA9IGZhY3Rvcihnc3ViKCJGYWN0b3IiLCAiRiIsIGZhY3RvciksCiAgIyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkYxIiwgIkYzIiwgIkYyIikpKSAlPiUKICAjIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZ3N1YigiRmFjdG9yIiwgIkYiLCBmYWN0b3IpLAogICMgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJGMiIsICJGMSIsICJGMyIpKSkgJT4lCiAgYXJyYW5nZShvcmRlciwgZmFjdG9yKQoKZmFjdG9yc19zNF9ibGFuazEgPC0gZmFjdG9yc19zNF9sb25nICU+JQogIG11dGF0ZShsb2FkaW5nID0gcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczRfbG9uZyRsb2FkaW5nKSkpCiMgZmFjdG9yc19zNF9ibGFuazIgPC0gZmFjdG9yc19zNF9sb25nICU+JQojICAgbXV0YXRlKGxvYWRpbmcgPSBpZmVsc2UoZmFjdG9yID09ICJGMSIsIGxvYWRpbmcsIHJlcCgxMDAsIGxlbmd0aChmYWN0b3JzX3M0X2xvbmckbG9hZGluZykqMi8zKSkpCmZhY3RvcnNfczRfYmxhbmsyIDwtIGZhY3RvcnNfczRfbG9uZyAlPiUKICBtdXRhdGUobG9hZGluZyA9IGlmZWxzZShmYWN0b3IgPT0gIkYyIiwgbG9hZGluZywgcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczRfbG9uZyRsb2FkaW5nKSoyLzMpKSkKZmFjdG9yc19zNF9ibGFuazMgPC0gZmFjdG9yc19zNF9sb25nICU+JQogIG11dGF0ZShsb2FkaW5nID0gaWZlbHNlKGZhY3RvciAhPSAiRjMiLCBsb2FkaW5nLCByZXAoMTAwLCBsZW5ndGgoZmFjdG9yc19zNF9sb25nJGxvYWRpbmcpKjEvMykpKQoKIyBnZ3Bsb3QoZmFjdG9yc19zNF9ibGFuazEsIGFlcyh4ID0gZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhvcmRlcikpLCBmaWxsID0gbG9hZGluZykpICsKIyAgIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKIyAgICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpKSArCiMgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLCBicmVha3MgPSBjKC0xLCAwLCAxKSwKIyAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwojICAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiMgICB0aGVtZV9taW5pbWFsKCkgKwojICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMAojIAojIGdncGxvdChmYWN0b3JzX3M0X2JsYW5rMiwgYWVzKHggPSBmYWN0b3IsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2Mob3JkZXIpKSwgZmlsbCA9IGxvYWRpbmcpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKIyAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwojICAgdGhlbWVfbWluaW1hbCgpICsKIyAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgIyAxMDAwIGJ5IDEwMDAKIyAKIyBnZ3Bsb3QoZmFjdG9yc19zNF9ibGFuazMsIGFlcyh4ID0gZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwojICAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwojICAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSkpICsKIyAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksIGJyZWFrcyA9IGMoLTEsIDAsIDEpLAojICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMjApKSArCiMgICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKIyAgIHRoZW1lX21pbmltYWwoKSArCiMgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiMgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICMgMTAwMCBieSAxMDAwCgpnZ3Bsb3QoZmFjdG9yc19zNF9sb25nLCBhZXMoeCA9IGZhY3RvcihmYWN0b3IsIGxhYmVscyA9IGMoIkJvZHktSGVhcnQiLCAiTWluZCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSksIHNpemUgPSA2KSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMC41MSwgeG1heCA9IDEuNDksIHltaW4gPSAxNC41NSwgeW1heCA9IDIwLjQ1KSwKICAjICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IC41KSArCiAgIyBnZW9tX3JlY3QoYWVzKHhtaW4gPSAxLjUxLCB4bWF4ID0gMi40OSwgeW1pbiA9IDYuNTUsIHltYXggPSAxNC40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMi41MSwgeG1heCA9IDMuNDksIHltaW4gPSAwLjU1LCB5bWF4ID0gNi40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgdGhlbWVfYncoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiU3R1ZHkgMSAoNC02eSkiKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMApgYGAKCmBgYHtyIGZpZ3VyZSBoZWF0bWFwIHM0IGZvcmNlIDMgZmFjdG9ycywgZmlnLndpZHRoID0gNCwgZmlnLmhlaWdodCA9IDd9CmVmYV9kNF9hbGxfZm9yY2VkM04gPC0gZmEoZDRfYWxsLCBuZmFjdG9ycyA9IDMsIGNvciA9IGNob3NlbkNvclR5cGUsIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUpCmZhY3RvcnNfczRfM2ZhYyA8LSBmYS5zb3J0KGVmYV9kX2FsbF9mb3JjZWQzTiRsb2FkaW5nc1tdKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJpdGVtIikgJT4lCiAgbGVmdF9qb2luKGNoYXJfcGxvdHRpbmdfd29yZGluZ3MsIGJ5ID0gYygiaXRlbSIgPSAiY2FwYWNpdHkiKSkgJT4lCiAgc2VsZWN0KHdvcmRpbmcsIHN0YXJ0c193aXRoKCJNUiIpKSAlPiUKICByZW5hbWUoY2FwYWNpdHkgPSB3b3JkaW5nLCBGYWN0b3IxID0gTVIxLCBGYWN0b3IyID0gTVIyLCBGYWN0b3IzID0gTVIzKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIm9yZGVyIikgJT4lCiAgbXV0YXRlKG9yZGVyID0gYXMubnVtZXJpYyhvcmRlcikpCgpmYWN0b3JzX3M0XzNmYWNfbG9uZyA8LSBmYWN0b3JzX3M0XzNmYWMgJT4lCiAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLWNhcGFjaXR5LCAtb3JkZXIpICU+JQogIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZ3N1YigiRmFjdG9yIiwgIkYiLCBmYWN0b3IpKSkgJT4lCiAgIyBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGdzdWIoIkZhY3RvciIsICJGIiwgZmFjdG9yKSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiRjEiLCAiRjMiLCAiRjIiKSkpICU+JQogICMgbXV0YXRlKGZhY3RvciA9IGZhY3Rvcihnc3ViKCJGYWN0b3IiLCAiRiIsIGZhY3RvciksCiAgIyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkYyIiwgIkYxIiwgIkYzIikpKSAlPiUKICBhcnJhbmdlKG9yZGVyLCBmYWN0b3IpCgpmYWN0b3JzX3M0XzNmYWNfYmxhbmsxIDwtIGZhY3RvcnNfczRfM2ZhY19sb25nICU+JQogIG11dGF0ZShsb2FkaW5nID0gcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczRfM2ZhY19sb25nJGxvYWRpbmcpKSkKIyBmYWN0b3JzX3M0XzNmYWNfYmxhbmsyIDwtIGZhY3RvcnNfczRfM2ZhY19sb25nICU+JQojICAgbXV0YXRlKGxvYWRpbmcgPSBpZmVsc2UoZmFjdG9yID09ICJGMSIsIGxvYWRpbmcsIHJlcCgxMDAsIGxlbmd0aChmYWN0b3JzX3M0XzNmYWNfbG9uZyRsb2FkaW5nKSoyLzMpKSkKZmFjdG9yc19zNF8zZmFjX2JsYW5rMiA8LSBmYWN0b3JzX3M0XzNmYWNfbG9uZyAlPiUKICBtdXRhdGUobG9hZGluZyA9IGlmZWxzZShmYWN0b3IgPT0gIkYyIiwgbG9hZGluZywgcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczRfM2ZhY19sb25nJGxvYWRpbmcpKjIvMykpKQpmYWN0b3JzX3M0XzNmYWNfYmxhbmszIDwtIGZhY3RvcnNfczRfM2ZhY19sb25nICU+JQogIG11dGF0ZShsb2FkaW5nID0gaWZlbHNlKGZhY3RvciAhPSAiRjMiLCBsb2FkaW5nLCByZXAoMTAwLCBsZW5ndGgoZmFjdG9yc19zNF8zZmFjX2xvbmckbG9hZGluZykqMS8zKSkpCgojIGdncGxvdChmYWN0b3JzX3M0XzNmYWNfYmxhbmsxLCBhZXMoeCA9IGZhY3RvciwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2Mob3JkZXIpKSwgZmlsbCA9IGxvYWRpbmcpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKIyAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwojICAgdGhlbWVfbWluaW1hbCgpICsKIyAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgIyAxMDAwIGJ5IDEwMDAKIyAKIyBnZ3Bsb3QoZmFjdG9yc19zNF8zZmFjX2JsYW5rMiwgYWVzKHggPSBmYWN0b3IsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2Mob3JkZXIpKSwgZmlsbCA9IGxvYWRpbmcpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKIyAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwojICAgdGhlbWVfbWluaW1hbCgpICsKIyAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgIyAxMDAwIGJ5IDEwMDAKIyAKIyBnZ3Bsb3QoZmFjdG9yc19zNF8zZmFjX2JsYW5rMywgYWVzKHggPSBmYWN0b3IsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2Mob3JkZXIpKSwgZmlsbCA9IGxvYWRpbmcpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKIyAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwojICAgdGhlbWVfbWluaW1hbCgpICsKIyAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgIyAxMDAwIGJ5IDEwMDAKCmdncGxvdChmYWN0b3JzX3M0XzNmYWNfbG9uZywgYWVzKHggPSBmYWN0b3IoZmFjdG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSksIHNpemUgPSA2KSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMC41MSwgeG1heCA9IDEuNDksIHltaW4gPSAxNC41NSwgeW1heCA9IDIwLjQ1KSwKICAjICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IC41KSArCiAgIyBnZW9tX3JlY3QoYWVzKHhtaW4gPSAxLjUxLCB4bWF4ID0gMi40OSwgeW1pbiA9IDYuNTUsIHltYXggPSAxNC40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMi41MSwgeG1heCA9IDMuNDksIHltaW4gPSAwLjU1LCB5bWF4ID0gNi40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgdGhlbWVfYncoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiU3R1ZHkgMSAoNC02eSkiKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMApgYGAKCiMjIENvbmdydWVuY2UKCmBgYHtyfQojIGZhY3RvciBjb25ncnVlbmNlCmZhY3Rvci5jb25ncnVlbmNlKGVmYV9kM19hbGxfcm90YXRlZE4sIGVmYV9kNF9hbGxfcm90YXRlZE4pCmZhY3Rvci5jb25ncnVlbmNlKGVmYV9kM19hbGxfcm90YXRlZE4sIGVmYV9kNF9hbGxfZm9yY2VkM04pCmBgYAoKIyMgTWVhbiByYXRpbmdzCgojIyMgU3R1ZGllcyAxLTIKCk1lYW4gcmF0aW5ncyBvZiA0MCBtZW50YWwgY2FwYWNpdGllcyBmb3IgdGhlIDIgZW50aXRpZXMgaW5jbHVkZWQgaW4gU3R1ZGllcyAxLTIuIFBhcnRpY2lwYW50cyByZXNwb25kZWQgb24gYSAzLXBvaW50IHNjYWxlICgwID0gIm5vIiwgMC41ID0gImtpbmRhIiwgMSA9ICJ5ZXMiKS4gRXJyb3IgYmFycyBhcmUgbm9ucGFyYW1ldHJpYyBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBNZW50YWwgY2FwYWNpdGllcyBhcmUgZ3JvdXBlZCBhY2NvcmRpbmcgdG8gdGhlaXIgZG9taW5hbnQgZmFjdG9yIGxvYWRpbmcgaW4gU3R1ZHkgMSAoYWR1bHRzKS4KCmBgYHtyIGZpZ3VyZSBtZWFuIHJhdGluZ3MgczEtczIsIGZpZy53aWR0aCA9IDMsIGZpZy5oZWlnaHQgPSAzfQojIG1ha2UgZGF0YWZyYW1lCnMxMl9wbG90dGluZyA8LSBjaGFyX3Bsb3R0aW5nICU+JQogIGZpbHRlcihzdHVkeSAlaW4lIGMoInN0dWR5IDEiLCAic3R1ZHkgMiIpKSAlPiUKICBkaXN0aW5jdCgpCgojIHBsb3QhIChvcmRlcmVkIGJ5IHN0dWR5IDMgZmFjdG9yIGxvYWRpbmdzKQpzMTIgPC0gZ2dwbG90KHMxMl9wbG90dGluZywKICAgICAgICAgICAgICAgYWVzKHkgPSBNZWFuLCB4ID0gcmVvcmRlcih3b3JkaW5nLCBkZXNjKHMxX29yZGVyKSksCiAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBmYWN0b3IoczFfY29sb3IpLCBzaGFwZSA9IHN0dWR5KSkgKwogIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjYpLCBzaXplID0gMikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyKSwgd2lkdGggPSAwLjQsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42KSkgKwogIGZhY2V0X3dyYXAofiBjaGFyYWN0ZXIpICsKICB0aGVtZV9idygpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJcbk1lYW4gcmF0aW5nIiwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLCAxKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAwLjUsIDEpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwXG4obm8pIiwgIjAuNVxuKGtpbmRhKSIsICIxXG4oeWVzKSIpKSArCiAgc2NhbGVfc2hhcGVfZGlzY3JldGUobmFtZSA9ICJTdHVkeToiLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlN0dWR5IDE6IGFkdWx0cyIsICJTdHVkeSAyOiA3LTl5IikpICsKICAjIHNjYWxlX2NvbG91cl9icmV3ZXIobmFtZSA9ICJGYWN0b3I6IiwKICAjICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJxdWFsIiwgcGFsZXR0ZSA9IDYsCiAgIyAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gRkFMU0UpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKG5hbWUgPSAiRmFjdG9yOiIsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjRTQxQTFDIiwgIiM0REFGNEEiLCAiIzM3N0VCOCIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQk9EWSIsICJNSU5EIiwgIkhFQVJUIikpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gcGFsZXR0ZV9zMSksCiAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpzMTIKYGBgCgojIyMgU3R1ZGllcyAzLTQKCk1lYW4gcmF0aW5ncyBvZiAyMCBtZW50YWwgY2FwYWNpdGllcyBmb3IgdGhlIDkgZW50aXRpZXMgaW5jbHVkZWQgaW4gU3R1ZGllcyAzLTQuIFBhcnRpY2lwYW50cyByZXNwb25kZWQgb24gYSAzLXBvaW50IHNjYWxlICgwID0gIm5vIiwgMC41ID0gImtpbmRhIiwgMSA9ICJ5ZXMiKS4gRXJyb3IgYmFycyBhcmUgbm9ucGFyYW1ldHJpYyBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBNZW50YWwgY2FwYWNpdGllcyBhcmUgZ3JvdXBlZCBhY2NvcmRpbmcgdG8gdGhlaXIgZG9taW5hbnQgZmFjdG9yIGxvYWRpbmcgaW4gU3R1ZHkgMyAoNy05eSkuCgpgYGB7ciBmaWd1cmUgbWVhbiByYXRpbmdzIHMzLXM0LCBmaWcud2lkdGggPSA1LCBmaWcuaGVpZ2h0ID0gM30KIyBtYWtlIGRhdGFmcmFtZQpzMzRfcGxvdHRpbmcgPC0gY2hhcl9wbG90dGluZyAlPiUKICBmaWx0ZXIoc3R1ZHkgJWluJSBjKCJzdHVkeSAzIiwgInN0dWR5IDQiKSwKICAgICAgICAgIWlzLm5hKHMzX29yZGVyKSwgIWlzLm5hKGNoYXJhY3RlciksICFpcy5uYShjYXBhY2l0eSkpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgbXV0YXRlKGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb21wdXRlciIsICJkb2xsIiwgInRlZGR5X2JlYXIiLCAicm9ib3QiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZXRsZSIsICJiaXJkIiwgIm1vdXNlIiwgImdvYXQiLCAiZWxlcGhhbnQiKSkpCgojIHBsb3QhIChvcmRlcmVkIGJ5IHN0dWR5IDMgZmFjdG9yIGxvYWRpbmdzKQpzMzQgPC0gZ2dwbG90KHMzNF9wbG90dGluZywKICAgICAgICAgICAgICAgYWVzKHkgPSBNZWFuLCB4ID0gcmVvcmRlcih3b3JkaW5nLCBkZXNjKHMzX29yZGVyKSksIAogICAgICAgICAgICAgICAgICAgIyBjb2xvdXIgPSBzdHVkeSwKICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IHMzX2NvbG9yLAogICAgICAgICAgICAgICAgICAgc2hhcGUgPSBzdHVkeSkpICsKICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42KSwgc2l6ZSA9IDIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciksIHdpZHRoID0gMC40LAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNikpICsKICBmYWNldF93cmFwKH4gY2hhcmFjdGVyLCBuY29sID0gOSkgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIlxuTWVhbiByYXRpbmciLAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsIDEpLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDAuNSwgMSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjBcbihubykiLCAiMC41XG4oa2luZGEpIiwgIjFcbih5ZXMpIikpICsKICBzY2FsZV9zaGFwZV9kaXNjcmV0ZShuYW1lID0gIlN0dWR5OiIsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiU3R1ZHkgMzogNy05eSIsICJTdHVkeSA0OiA0LTZ5IikpICsKICAjIHNjYWxlX2NvbG91cl9kaXNjcmV0ZShuYW1lID0gIlN0dWR5OiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJTdHVkeSAzOiA3LTl5IiwgIlN0dWR5IDQ6IDQtNnkiKSkgKwogICMgc2NhbGVfY29sb3VyX2JyZXdlcihuYW1lID0gIkZhY3RvcjoiLAogICMgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInF1YWwiLCBwYWxldHRlID0gNiwKICAjICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBGQUxTRSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwobmFtZSA9ICJGYWN0b3I6IiwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIiNFNDFBMUMiLCAiIzM3N0VCOCIsICIjNERBRjRBIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvdXIgPSBwYWxldHRlX3MxKSwKICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCgpzMzQKYGBgCgojIE1lYW4gZmFjdG9yIHNjb3JlcwoKIyMgU3R1ZGllcyAxLTIKCmBgYHtyIHMxMiBhbGwgbm8gcm90YXRpb24sIGluY2x1ZGUgPSBGfQojIG1ha2UgY29tYmluZWQgZGF0YXNldApkMTJfYWxsIDwtIGQxX2FsbCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIGZ1bGxfam9pbihkMl9hbGwgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJpZCIpCgojICMgZXhhbWluZSBzY3JlZSBwbG90CiMgZmEucGFyYWxsZWwoZDEyX2FsbCkKCiMgcnVuIEVGQSB3aXRob3V0IHJvdGF0aW9uIHdpdGggTiBmYWN0b3JzCmVmYV9kMTJfYWxsX3Vucm90YXRlZCA8LSBmYShkMTJfYWxsLCAxMywgcm90YXRlID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3IgPSBjaG9zZW5Db3JUeXBlLCBmbSA9ICJtaW5yZXMiKQpwcmludChlZmFfZDEyX2FsbF91bnJvdGF0ZWQpCgojIGV4YW1pbmUgZWlnZW52YWx1ZXMgYW5kIHZhcmlhbmNlIGV4cGxhaW5lZAplZmFfZDEyX2FsbF91bnJvdGF0ZWRfZWlnZW52YWx1ZXMgPC0gcHJpbnQoZWZhX2QxMl9hbGxfdW5yb3RhdGVkKSRWYWNjb3VudGVkICU+JQogIHQoKSAlPiUKICBkYXRhLmZyYW1lKCkKCiMgY291bnQgZmFjdG9ycyB3aXRoIGVpZ2VudmFsdWVzID4gMSBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkID4gNSUKZWZhX2QxMl9hbGxfdW5yb3RhdGVkX25mYWN0b3JzIDwtIGVmYV9kMTJfYWxsX3Vucm90YXRlZF9laWdlbnZhbHVlcyAlPiUKICBmaWx0ZXIoU1MubG9hZGluZ3MgPiAxLCBQcm9wb3J0aW9uLkV4cGxhaW5lZCA+IDAuMDUpICU+JQogIGNvdW50KCkgJT4lCiAgYXMubnVtZXJpYygpCmVmYV9kMTJfYWxsX3Vucm90YXRlZF9uZmFjdG9ycwpgYGAKCmBgYHtyIHMxMiBhbGwgcm90YXRpb24sIGluY2x1ZGUgPSBGfQplZmFfZDEyX2FsbF9yb3RhdGVkX21heCA8LSBmYShkMTJfYWxsLCAxMywgcm90YXRlID0gY2hvc2VuUm90VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKCmVmYV9kMTJfYWxsX3JvdGF0ZWQgPC0gZmEoZDEyX2FsbCwgZWZhX2QxMl9hbGxfdW5yb3RhdGVkX25mYWN0b3JzLCByb3RhdGUgPSBjaG9zZW5Sb3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3IgPSBjaG9zZW5Db3JUeXBlLCBmbSA9ICJtaW5yZXMiKQoKIyBjaGVjayB0aGF0IGVhY2ggb2YgdGhlc2UgZmFjdG9ycyBpcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBhdCBsZWFzdCBvbmUgbWVudGFsIGNhcGFjaXR5IGl0ZW0KZWZhX2QxMl9hbGxfcm90YXRlZF9sb2FkaW5ncyA8LSBmYS5zb3J0KGxvYWRpbmdzKGVmYV9kMTJfYWxsX3JvdGF0ZWQpW10pICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLWNhcGFjaXR5KSAlPiUKICBtdXRhdGUobG9hZGluZ19hYnMgPSBhYnMobG9hZGluZykpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBsb2FkaW5nX2FicykgJT4lCiAgdW5ncm91cCgpCmVmYV9kMTJfYWxsX3JvdGF0ZWRfbG9hZGluZ3MKCiMgZHJvcCBhbnkgZmFjdG9ycyB3aGVyZSBuIDwgMQplZmFfZDEyX2FsbF9yb3RhdGVkX2xvYWRpbmdzICU+JSAKICBjb3VudChmYWN0b3IpICU+JSAKICBmaWx0ZXIobiA+IDApCgojIHNldCBudW1iZXIgb2YgZmFjdG9ycyB0byBleHRyYWN0Cm5mYWN0b3JzX2QxMl9hbGwgPC0gZWZhX2QxMl9hbGxfcm90YXRlZF9sb2FkaW5ncyAlPiUgCiAgY291bnQoZmFjdG9yKSAlPiUgCiAgZmlsdGVyKG4gPiAwKSAlPiUKICBucm93KCkKbmZhY3RvcnNfZDEyX2FsbApgYGAKCmBgYHtyIHMxMiBhbGwgcm90YXRpb24gMiwgaW5jbHVkZSA9IEZ9CiMgcnVuIEVGQSB3aXRoIHJvdGF0aW9uIHdpdGggTiBmYWN0b3JzCmVmYV9kMTJfYWxsX3JvdGF0ZWROIDwtIGZhKGQxMl9hbGwsIG5mYWN0b3JzX2QxMl9hbGwsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgbWlzc2luZyA9IFRSVUUpICMgaW1wdXRlIG1pc3NpbmcgdmFsdWVzCnByaW50KGVmYV9kMTJfYWxsX3JvdGF0ZWROKQoKIyBnZXQgbG9hZGluZ3MgZm9yIGVhY2ggZmFjdG9yCmVmYV9kMTJfYWxsX3JvdGF0ZWROX2xvYWRpbmdzIDwtIGxvYWRpbmdzKGVmYV9kMTJfYWxsX3JvdGF0ZWROKVtdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpCmBgYAoKYGBge3IgczEyIGxvYWRpbmdzIHRhYmxlLCBpbmNsdWRlID0gRn0KZGF0YS5mcmFtZShsb2FkaW5ncyhmYS5zb3J0KGVmYV9kMTJfYWxsX3JvdGF0ZWROKSlbXSkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJjYXBhY2l0eSIpICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJNIikpLCBmdW5zKHJvdW5kMikpCmBgYAoKYGBge3IgczEyIGZpZ3VyZSBzZXR1cCwgaW5jbHVkZSA9IEZ9CiMgc2NvcmVzX3MxMiA8LSBkMSAlPiUgCiMgICBzZWxlY3Qoc3ViaWQsIGFnZV9ncm91cCwgY2hhcmFjdGVyKSAlPiUgCiMgICBkaXN0aW5jdCgpICU+JSAKIyAgIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQojICAgZnVsbF9qb2luKGQyICU+JSAKIyAgICAgICAgICAgICAgIHNlbGVjdChzdWJpZCwgYWdlX2dyb3VwLCBjaGFyYWN0ZXIpICU+JSAKIyAgICAgICAgICAgICAgIGRpc3RpbmN0KCkgJT4lIAojICAgICAgICAgICAgICAgbXV0YXRlKHN1YmlkID0gcGFzdGUoY2hhcmFjdGVyLCBzdWJpZCwgc2VwID0gIl8iKSkpICU+JQojICAgZnVsbF9qb2luKGVmYV9kMTJfYWxsX3JvdGF0ZWROJHNjb3JlcyAlPiUgCiMgICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lIAojICAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKIyAgIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSkgJT4lCiMgICByZW5hbWUoc2NvcmVfRjEgPSBNUjEsIHNjb3JlX0YyID0gTVIyLCBzY29yZV9GMyA9IE1SMykgJT4lCiMgICBmaWx0ZXIoIWlzLm5hKHNjb3JlX0YxKSwgIWlzLm5hKHNjb3JlX0YyKSwgIWlzLm5hKHNjb3JlX0YzKSwgIWlzLm5hKGFnZV9ncm91cCkpICU+JQojICAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIHN0YXJ0c193aXRoKCJzY29yZV8iKSkgJT4lCiMgICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvcikpIAojIAojIHNjb3Jlc19zMTJfcGxvdHRpbmcgPC0gc2NvcmVzX3MxMiAlPiUKIyAgIGdyb3VwX2J5KGFnZV9ncm91cCwgY2hhcmFjdGVyLCBmYWN0b3IpICU+JQojICAgZG8oZGF0YS5mcmFtZShyYmluZChzbWVhbi5jbC5ib290KC4kc2NvcmUpKSkpCmBgYAoKYGBge3IgczEyIHJlZ3Jlc3Npb259CiMgdGVtcEMgPC0gZDEgJT4lIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQojICAgZnVsbF9qb2luKGQyICU+JSBtdXRhdGUoc3ViaWQgPSBwYXN0ZShjaGFyYWN0ZXIsIHN1YmlkLCBzZXAgPSAiXyIpKSkgJT4lCiMgICBmdWxsX2pvaW4oZGF0YS5mcmFtZShlZmFfZDEyX2FsbF9yb3RhdGVkTiRzY29yZXMpICU+JQojICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKIyAgICAgICAgICAgICAgIGdhdGhlcihmYWN0b3IsIHNjb3JlLCAtc3ViaWQpKSAlPiUKIyAgIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yKSwKIyAgICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwKSwKIyAgICAgICAgICBjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSkgIyAlPiUKIyAgICMgZmlsdGVyKCFpcy5uYShmYWN0b3IpLCAhaXMubmEoYWdlX2dyb3VwKSwgIWlzLm5hKGNoYXJhY3RlcikpCiMgCiMgY29udHJhc3RzKHRlbXBDJGZhY3RvcikgPSBjYmluZChmYWN0b3IxID0gYygxLCAtMSwgMCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IzID0gYygwLCAtMSwgMSkpCiMgCiMgY29udHJhc3RzKHRlbXBDJGFnZV9ncm91cCkgPSBjYmluZChjaGlsZHJlbiA9IGMoLTEsIDEpKQojIGNvbnRyYXN0cyh0ZW1wQyRjaGFyYWN0ZXIpID0gY2JpbmQocm9ib3QgPSBjKC0xLCAxKSkKIyAKIyBsaWJyYXJ5KGxtZTQpCiMgcjEgPC0gbG1lcihzY29yZSB+IGNoYXJhY3RlciAqIGZhY3RvciAqIGFnZV9ncm91cCArICgxIHwgc3ViaWQpICwgdGVtcEMpCiMgc3VtbWFyeShyMSkKIyAKIyAjIGxpYnJhcnkoYnJtcykKIyAjIHIxYiA8LSBicm0oc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKiBhZ2VfZ3JvdXAgKyAoMSB8IHN1YmlkKSAsIHRlbXBDLAojICMgICAgICAgICAgICAgZmFtaWx5ID0gImdhdXNzaWFuIikKIyAjIHN1bW1hcnkocjFiKQpgYGAKCmBgYHtyIHMxMiBmYWN0b3Igc2NvcmVzIGJ5IGFnZSBvcHRpb24gMiBzZXR1cH0KIyBwcm9qZWN0IDctOXlvIGRhdGEgaW50byBhZHVsdCBzcGFjZQp0ZW1wX3ByZWRpY3RfNzkgPC0gcHJlZGljdChlZmFfZDFfYWxsX3JvdGF0ZWROLCBkMl9hbGwsIGQxX2FsbCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKQojIHJvdW5kKGNvcihlZmFfZDFfYWxsX3JvdGF0ZWROJHNjb3JlcywgdGVtcF9wcmVkaWN0Xzc5WywtMV0sIHVzZSA9ICJjb21wbGV0ZS5vYnMiKSwgMykKCnRlbXBfY29tYm9fYWR1bHQgPC0gZWZhX2QxX2FsbF9yb3RhdGVkTiRzY29yZXMgJT4lIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lCiAgZnVsbF9qb2luKHRlbXBfcHJlZGljdF83OSkKCnNjb3Jlc19zMTIgPC0gZDEgJT4lCiAgc2VsZWN0KGFnZV9ncm91cCwgc3ViaWQsIGFnZSwgY2hhcmFjdGVyKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQogIGZ1bGxfam9pbihkMiAlPiUKICAgICAgICAgICAgICBzZWxlY3QoYWdlX2dyb3VwLCBzdWJpZCwgYWdlLCBjaGFyYWN0ZXIpICU+JQogICAgICAgICAgICAgIGRpc3RpbmN0KCkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKHN1YmlkID0gcGFzdGUoY2hhcmFjdGVyLCBzdWJpZCwgc2VwID0gIl8iKSkpICU+JQogIGZ1bGxfam9pbih0ZW1wX2NvbWJvX2FkdWx0KSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlcikpICU+JQogIG11dGF0ZShhZ2UgPSBpZmVsc2UoYWdlIDwgNi41LCBOQSwgYWdlKSkgJT4lCiAgcmVuYW1lKHNjb3JlX0YxID0gTVIxLCBzY29yZV9GMiA9IE1SMiwgc2NvcmVfRjMgPSBNUjMpICU+JQogIGZpbHRlcighaXMubmEoc2NvcmVfRjEpLCAhaXMubmEoc2NvcmVfRjIpLCAhaXMubmEoc2NvcmVfRjMpLCAhaXMubmEoYWdlKSkgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIHN0YXJ0c193aXRoKCJzY29yZV8iKSkgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IpKQoKc2NvcmVzX3MxMl9wbG90dGluZyA8LSBzY29yZXNfczEyICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgY2hhcmFjdGVyLCBmYWN0b3IpICU+JQogIGRvKGRhdGEuZnJhbWUocmJpbmQoc21lYW4uY2wuYm9vdCguJHNjb3JlKSkpKQpgYGAKCmBgYHtyIHMxMiBmaWd1cmUgZmFjdG9yIHNjb3JlcyBieSBhZ2UgZ3JvdXAsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQgPSAzfQojIHBsb3QKZ2dwbG90KHNjb3Jlc19zMTJfcGxvdHRpbmcgJT4lCiAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJPRFkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JTkQiKSksCiAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbHMgPSBjKCJhZHVsdHMiLCAiY2hpbGRyZW5fNzkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGFiZWxzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuIikpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNoaWxkcmVuXzc5IiwgImFkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY2hpbGRyZW4iLCAiYWR1bHRzIikpKSwKICAgICAgIGFlcyh4ID0gYWdlX2dyb3VwLCB5ID0gTWVhbiwgY29sb3IgPSBjaGFyYWN0ZXIsIHNoYXBlID0gY2hhcmFjdGVyKSkgKwogIGZhY2V0X3dyYXAoImZhY3RvciIsIG5jb2wgPSAzKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ2VvbV9wb2ludChzaXplID0gNSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNCkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciksCiAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNCkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxOSwgMTUpKSArCiAgbGFicyh0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGFnZSBncm91cCIsCiAgICAgICAjIHN1YnRpdGxlID0gIkFkdWx0cyAoU3R1ZHkgMSkgdnMuIGNoaWxkcmVuIChTdHVkeSAyKVxuIiwKICAgICAgIHggPSAiQWdlIGdyb3VwIiwKICAgICAgIHkgPSAiTWVhbiBmYWN0b3Igc2NvcmUiKSAjIDEwMDAgYnkgNTAwCmBgYAoKIyMgU3R1ZHkgMwoKYGBge3IgczMgZmlndXJlIHNldHVwLCBpbmNsdWRlID0gRn0Kc2NvcmVzX3MzX3Bsb3R0aW5nIDwtIGQzICU+JSAKICBzZWxlY3Qoc3ViaWQsIGFnZV9ncm91cCwgY2hhcmFjdGVyKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlKHN1YmlkID0gcGFzdGUoY2hhcmFjdGVyLCBzdWJpZCwgc2VwID0gIl8iKSkgJT4lCiAgZnVsbF9qb2luKGVmYV9kM19hbGxfcm90YXRlZE4kc2NvcmVzICU+JSAKICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lIAogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSkgJT4lCiAgbXV0YXRlKGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIpKSAlPiUKICByZW5hbWUoc2NvcmVfRjEgPSBNUjEsIHNjb3JlX0YyID0gTVIyLCBzY29yZV9GMyA9IE1SMykgJT4lCiAgZmlsdGVyKCFpcy5uYShzY29yZV9GMSksICFpcy5uYShzY29yZV9GMiksICFpcy5uYShzY29yZV9GMyksICFpcy5uYShhZ2VfZ3JvdXApKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgc3RhcnRzX3dpdGgoInNjb3JlXyIpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvcikpICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgY2hhcmFjdGVyLCBmYWN0b3IpICU+JQogIGRvKGRhdGEuZnJhbWUocmJpbmQoc21lYW4uY2wuYm9vdCguJHNjb3JlKSkpKQpgYGAKCmBgYHtyIHMzIGZpZ3VyZSBmYWN0b3Igc2NvcmVzIGJ5IGNoYXJhY3RlciwgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDN9CmdncGxvdChzY29yZXNfczNfcGxvdHRpbmcgJT4lCiAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgbXV0YXRlKGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwgImRvbGwiLCAidGVkZHlfYmVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVldGxlIiwgImJpcmQiLCAibW91c2UiLCAiZ29hdCIsICJlbGVwaGFudCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwgImRvbGwiLCAidGVkZHkgYmVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVldGxlIiwgImJpcmQiLCAibW91c2UiLCAiZ29hdCIsICJlbGVwaGFudCIpKSwKICAgICAgICAgICAgICAgIGZhY3RvciA9IGZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygic2NvcmVfRjIiLCAic2NvcmVfRjEiLCAic2NvcmVfRjMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJTb2NpYWwtZW1vdGlvbmFsIiwgIkJvZGlseSIsICJQZXJjZXB0dWFsLWNvZ25pdGl2ZSIpKSksCiAgICAgICBhZXMoeCA9IGNoYXJhY3RlciwgeSA9IE1lYW4sIGNvbG9yID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKH4gZmFjdG9yLCBuY29sID0gMykgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBnZW9tX3BvaW50KHNpemUgPSA1LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC40KSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyKSwgCiAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNCkpICsKICAjIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICIjMDBCRkM0IiwgIiNGODc2NkQiLCByZXAoImJsYWNrIiwgNCkpKSArCiAgIyBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNywgMTUsIDE5LCByZXAoMTcsIDQpKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICIjMDBCRkM0IiwgcmVwKCJncmF5IiwgMiksICIjRjg3NjZEIiwgcmVwKCJibGFjayIsIDQpKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE3LCAxNSwgcmVwKDE3LCAyKSwgMTksIHJlcCgxNywgNCkpKSArCiAgbGFicyh0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGNoYXJhY3RlciIsCiAgICAgICB4ID0gIkNoYXJhY3RlciIsCiAgICAgICB5ID0gIk1lYW4gZmFjdG9yIHNjb3JlIikgIyAxMDAwIGJ5IDUwMApgYGAKCgojIyBTdHVkaWVzIDMtNAoKYGBge3IgczM0IGFsbCBubyByb3RhdGlvbiwgaW5jbHVkZSA9IEZ9CiMgbWFrZSBjb21iaW5lZCBkYXRhc2V0CmQzNF9hbGwgPC0gZDNfYWxsICU+JSByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lCiAgZnVsbF9qb2luKGQ0X2FsbCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKCiMgIyBleGFtaW5lIHNjcmVlIHBsb3QKIyBmYS5wYXJhbGxlbChkMzRfYWxsKQoKIyBydW4gRUZBIHdpdGhvdXQgcm90YXRpb24gd2l0aCBOIGZhY3RvcnMKZWZhX2QzNF9hbGxfdW5yb3RhdGVkIDwtIGZhKGQzNF9hbGwsIDYsIHJvdGF0ZSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKcHJpbnQoZWZhX2QzNF9hbGxfdW5yb3RhdGVkKQoKIyBleGFtaW5lIGVpZ2VudmFsdWVzIGFuZCB2YXJpYW5jZSBleHBsYWluZWQKZWZhX2QzNF9hbGxfdW5yb3RhdGVkX2VpZ2VudmFsdWVzIDwtIHByaW50KGVmYV9kMzRfYWxsX3Vucm90YXRlZCkkVmFjY291bnRlZCAlPiUKICB0KCkgJT4lCiAgZGF0YS5mcmFtZSgpCgojIGNvdW50IGZhY3RvcnMgd2l0aCBlaWdlbnZhbHVlcyA+IDEgYW5kIHZhcmlhbmNlIGV4cGxhaW5lZCA+IDUlCmVmYV9kMzRfYWxsX3Vucm90YXRlZF9uZmFjdG9ycyA8LSBlZmFfZDM0X2FsbF91bnJvdGF0ZWRfZWlnZW52YWx1ZXMgJT4lCiAgZmlsdGVyKFNTLmxvYWRpbmdzID4gMSwgUHJvcG9ydGlvbi5FeHBsYWluZWQgPiAwLjA1KSAlPiUKICBjb3VudCgpICU+JQogIGFzLm51bWVyaWMoKQplZmFfZDM0X2FsbF91bnJvdGF0ZWRfbmZhY3RvcnMKYGBgCgpgYGB7ciBzMzQgYWxsIHJvdGF0aW9uLCBpbmNsdWRlID0gRn0KZWZhX2QzNF9hbGxfcm90YXRlZF9tYXggPC0gZmEoZDM0X2FsbCwgNiwgcm90YXRlID0gY2hvc2VuUm90VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKCmVmYV9kMzRfYWxsX3JvdGF0ZWQgPC0gZmEoZDM0X2FsbCwgZWZhX2QzNF9hbGxfdW5yb3RhdGVkX25mYWN0b3JzLCByb3RhdGUgPSBjaG9zZW5Sb3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3IgPSBjaG9zZW5Db3JUeXBlLCBmbSA9ICJtaW5yZXMiKQoKIyBjaGVjayB0aGF0IGVhY2ggb2YgdGhlc2UgZmFjdG9ycyBpcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBhdCBsZWFzdCBvbmUgbWVudGFsIGNhcGFjaXR5IGl0ZW0KZWZhX2QzNF9hbGxfcm90YXRlZF9sb2FkaW5ncyA8LSBmYS5zb3J0KGxvYWRpbmdzKGVmYV9kMzRfYWxsX3JvdGF0ZWQpW10pICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLWNhcGFjaXR5KSAlPiUKICBtdXRhdGUobG9hZGluZ19hYnMgPSBhYnMobG9hZGluZykpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBsb2FkaW5nX2FicykgJT4lCiAgdW5ncm91cCgpCmVmYV9kMzRfYWxsX3JvdGF0ZWRfbG9hZGluZ3MKCiMgZHJvcCBhbnkgZmFjdG9ycyB3aGVyZSBuIDwgMQplZmFfZDM0X2FsbF9yb3RhdGVkX2xvYWRpbmdzICU+JSAKICBjb3VudChmYWN0b3IpICU+JSAKICBmaWx0ZXIobiA+IDApCgojIHNldCBudW1iZXIgb2YgZmFjdG9ycyB0byBleHRyYWN0Cm5mYWN0b3JzX2QzNF9hbGwgPC0gZWZhX2QzNF9hbGxfcm90YXRlZF9sb2FkaW5ncyAlPiUgCiAgY291bnQoZmFjdG9yKSAlPiUgCiAgZmlsdGVyKG4gPiAwKSAlPiUKICBucm93KCkKbmZhY3RvcnNfZDM0X2FsbApgYGAKCmBgYHtyIHMzNCBhbGwgcm90YXRpb24gMiwgaW5jbHVkZSA9IEZ9CiMgIyBydW4gRUZBIHdpdGggcm90YXRpb24gd2l0aCBOIGZhY3RvcnMKIyBlZmFfZDM0X2FsbF9yb3RhdGVkTiA8LSBmYShkMzRfYWxsLCBuZmFjdG9yc19kMzRfYWxsLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBtaXNzaW5nID0gVFJVRSkgIyBpbXB1dGUgbWlzc2luZyB2YWx1ZXMKIyBwcmludChlZmFfZDM0X2FsbF9yb3RhdGVkTikKCiMgZm9yY2UgMyBmYWN0b3JzCmVmYV9kMzRfYWxsX3JvdGF0ZWROIDwtIGZhKGQzNF9hbGwsIDMsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgbWlzc2luZyA9IFRSVUUpICMgaW1wdXRlIG1pc3NpbmcgdmFsdWVzCnByaW50KGVmYV9kMzRfYWxsX3JvdGF0ZWROKQoKIyBnZXQgbG9hZGluZ3MgZm9yIGVhY2ggZmFjdG9yCmVmYV9kMzRfYWxsX3JvdGF0ZWROX2xvYWRpbmdzIDwtIGxvYWRpbmdzKGVmYV9kMzRfYWxsX3JvdGF0ZWROKVtdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpCmBgYAoKYGBge3IgczM0IGxvYWRpbmdzIHRhYmxlLCBpbmNsdWRlID0gRn0KZGF0YS5mcmFtZShsb2FkaW5ncyhmYS5zb3J0KGVmYV9kMzRfYWxsX3JvdGF0ZWROKSlbXSkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJjYXBhY2l0eSIpICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJNIikpLCBmdW5zKHJvdW5kMikpCmBgYAoKYGBge3IgczM0IHN1YnNjYWxlIHJlbGlhYmlsaXR5fQojICMgQ3JvbmJhY2gncyBhbHBoYSAoc3Vic2NhbGVzKQojIGtleXMubGlzdF9zMzQgPC0gbGlzdChIRUFSVCA9IGMoInByaWRlIiwgImRlcHJlc3NlZCIsICJkaXNyZXNwZWN0ZWQiLCAiaGFwcHkiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG92ZSIsICJlbWJhcnJhc3NlZCIsICJhbmdyeSIsICJndWlsdCIpLAojICAgICAgICAgICAgICAgICAgIEJPRFkgPSBjKCJodW5ncnkiLCAib2RvcnMiLCAiZmVhciIsICJ0aXJlZCIsICJwYWluIiwgIm5hdXNlYXRlZCIpLAojICAgICAgICAgICAgICAgICAgIE1JTkQgPSBjKCJ0ZW1wZXJhdHVyZSIsICJyZWFzb25pbmciLCAicmVtZW1iZXJpbmciLCAiY2hvaWNlcyIsICAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVwdGgiLCAiY29uc2Npb3VzIikpIAojIHNjb3JlcyA8LSBzY29yZUl0ZW1zKGtleXMubGlzdF9zMzQsIGQzNF9hbGwsIG1pbiA9IDAsIG1heCA9IDEpICAjIG9yIGp1c3QgdXNlIHRoZSBrZXlzLmxpdAojICMgc3VtbWFyeShzY29yZXMpCiMgc2NvcmVzCiMgCiMgIyBvbWVnYQojIG9tZWdhKGQzNF9hbGwsIDMsIHBsb3QgPSBGKQpgYGAKCmBgYHtyIHMzNCBmaWd1cmUgc2V0dXAsIGluY2x1ZGUgPSBGfQpzY29yZXNfczM0X3Bsb3R0aW5nIDwtIGQzICU+JSAKICBzZWxlY3Qoc3ViaWQsIGFnZV9ncm91cCwgY2hhcmFjdGVyKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlKHN1YmlkID0gcGFzdGUoY2hhcmFjdGVyLCBzdWJpZCwgc2VwID0gIl8iKSkgJT4lCiAgZnVsbF9qb2luKGQ0ICU+JSAKICAgICAgICAgICAgICBzZWxlY3Qoc3ViaWQsIGFnZV9ncm91cCwgY2hhcmFjdGVyKSAlPiUgCiAgICAgICAgICAgICAgZGlzdGluY3QoKSAlPiUgCiAgICAgICAgICAgICAgbXV0YXRlKHN1YmlkID0gcGFzdGUoY2hhcmFjdGVyLCBzdWJpZCwgc2VwID0gIl8iKSkpICU+JQogICMgbm90ZSB0aGF0IHRoaXMgaXMgc3RpbGwgdGhlIG9sZCB3YXkgKG5vdCBwcm9qZWN0aW9uIGludG8gb2xkZXIgZmFjdG9yIHNwYWNlKQogIGZ1bGxfam9pbihlZmFfZDM0X2FsbF9yb3RhdGVkTiRzY29yZXMgJT4lIAogICAgICAgICAgICAgIGRhdGEuZnJhbWUoKSAlPiUgCiAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlcikpICU+JQogIHJlbmFtZShzY29yZV9GMSA9IE1SMSwgc2NvcmVfRjIgPSBNUjIsIHNjb3JlX0YzID0gTVIzKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHNjb3JlX0YxKSwgIWlzLm5hKHNjb3JlX0YyKSwgCiAgICAgICAgICFpcy5uYShzY29yZV9GMyksCiAgICAgICAgICFpcy5uYShhZ2VfZ3JvdXApKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgc3RhcnRzX3dpdGgoInNjb3JlXyIpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvcikpICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgY2hhcmFjdGVyLCBmYWN0b3IpICU+JQogIGRvKGRhdGEuZnJhbWUocmJpbmQoc21lYW4uY2wuYm9vdCguJHNjb3JlKSkpKQpgYGAKCmBgYHtyIHMzNCBmaWd1cmUgZmFjdG9yIHNjb3JlcyBieSBhZ2UgZ3JvdXAsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQgPSAzfQojIHBsb3QgKG9sZCB3YXksIG5vdCBwcm9qZWN0aW9uISkKZ2dwbG90KHNjb3Jlc19zMzRfcGxvdHRpbmcgJT4lCiAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgbXV0YXRlKGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwgImRvbGwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWRkeV9iZWFyIiwgImJlZXRsZSIsICJiaXJkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2UiLCAiZ29hdCIsICJlbGVwaGFudCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwgImRvbGwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWRkeSBiZWFyIiwgImJlZXRsZSIsICJiaXJkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2UiLCAiZ29hdCIsICJlbGVwaGFudCIpKSwKICAgICAgICAgICAgICAgIGZhY3RvciA9IGZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygic2NvcmVfRjEiLCAic2NvcmVfRjIiLCAic2NvcmVfRjMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJIZWFydCIsICJNaW5kIiwgIkJvZHkiKSksCiAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNoaWxkcmVuXzQ2IiwgImNoaWxkcmVuXzc5IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiNC02eSIsICI3LTl5IikpKSwKICAgICAgIGFlcyh4ID0gY2hhcmFjdGVyLCB5ID0gTWVhbiwgCiAgICAgICAgICAgY29sb3IgPSBhZ2VfZ3JvdXApKSArCiAgICAgICAgICAgIyBjb2xvciA9IGNoYXJhY3RlciwgCiAgICAgICAgICAgIyBzaGFwZSA9IGFnZV9ncm91cCkpICsKICBmYWNldF93cmFwKH4gZmFjdG9yLCBuY29sID0gMykgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDUsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjQpKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IExvd2VyLCB5bWF4ID0gVXBwZXIpLCAKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC40KSkgKwogICMgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgIiMwMEJGQzQiLCAiI0Y4NzY2RCIsIHJlcCgiYmxhY2siLCA0KSkpICsKICAjIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE3LCAxNSwgMTksIHJlcCgxNywgNCkpKSArCiAgIyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiIzAwQkZDNCIsIHJlcCgiZ3JheSIsIDIpLCAiI0Y4NzY2RCIsIHJlcCgiYmxhY2siLCA0KSksCiAgICAgICAgICAgICAgICAgICAgICMgZ3VpZGUgPSBGQUxTRSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIGxhYnMoI3RpdGxlID0gIkZhY3RvciBzY29yZXMgYnkgY2hhcmFjdGVyIGFuZCBhZ2UgZ3JvdXAiLAogICAgICAgeCA9ICJDaGFyYWN0ZXIiLAogICAgICAgeSA9ICJNZWFuIGZhY3RvciBzY29yZSIsCiAgICAgICBjb2xvciA9ICJBZ2UgZ3JvdXA6ICIpICMgMTAwMCBieSA1MDAKYGBgCgojIEZhY3RvciBzY29yZXMgYnkgYWdlCgojIyBTdHVkeSAxCgpgYGB7ciBzMSBmYWN0b3Igc2NvcmVzIGJ5IGFnZSBzZXR1cCwgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDN9CnNjb3Jlc19zMV9wbG90dGluZyA8LSBkMSAlPiUgCiAgc2VsZWN0KHN1YmlkLCBhZ2UsIGNoYXJhY3RlcikgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQogIGZ1bGxfam9pbihlZmFfZDFfYWxsX3JvdGF0ZWROJHNjb3JlcyAlPiUgCiAgICAgICAgICAgICAgZGF0YS5mcmFtZSgpICU+JSAKICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikpICU+JQogIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSkgJT4lCiAgcmVuYW1lKHNjb3JlX0YxID0gTVIxLCBzY29yZV9GMiA9IE1SMiwgc2NvcmVfRjMgPSBNUjMpICU+JQogIGZpbHRlcighaXMubmEoc2NvcmVfRjEpLCAhaXMubmEoc2NvcmVfRjIpLCAhaXMubmEoc2NvcmVfRjMpLCAhaXMubmEoYWdlKSkgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIHN0YXJ0c193aXRoKCJzY29yZV8iKSkgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IpKQoKZ2dwbG90KHNjb3Jlc19zMV9wbG90dGluZyAlPiUKICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJzY29yZV9GMSIsICJzY29yZV9GMiIsICJzY29yZV9GMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlNvY2lhbC1lbW90aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvZGlseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVyY2VwdHVhbC1jb2duaXRpdmUiKSkpLAogICAgICAgYWVzKHggPSBhZ2UsIHkgPSBzY29yZSwgY29sb3IgPSBjaGFyYWN0ZXIsIGZpbGwgPSBjaGFyYWN0ZXIsIHNoYXBlID0gY2hhcmFjdGVyKSkgKwogIGZhY2V0X3dyYXAoImZhY3RvciIsIG5jb2wgPSAzKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgIyBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBhbHBoYSA9IDAuNCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFscGhhID0gMC40KSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE5LCAxNSkpICsKICBsYWJzKHRpdGxlID0gIkZhY3RvciBzY29yZXMgYnkgYWR1bHRzJyBhZ2UiLAogICAgICAgIyBzdWJ0aXRsZSA9ICJBZHVsdHMgKFN0dWR5IDEpXG4iLAogICAgICAgeCA9ICJBZ2UgKHllYXJzKSIsCiAgICAgICB5ID0gIkZhY3RvciBzY29yZSIpICMgMTAwMCBieSA1MDAKYGBgCgojIyBTdHVkeSAyCgpgYGB7ciBzMiBmYWN0b3Igc2NvcmVzIGJ5IGFnZSBzZXR1cCwgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDN9CnNjb3Jlc19zMl9wbG90dGluZyA8LSBkMiAlPiUgCiAgc2VsZWN0KHN1YmlkLCBhZ2UsIGNoYXJhY3RlcikgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQogIGZ1bGxfam9pbihlZmFfZDJfYWxsX3JvdGF0ZWROJHNjb3JlcyAlPiUgCiAgICAgICAgICAgICAgZGF0YS5mcmFtZSgpICU+JSAKICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikpICU+JQogIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSkgJT4lCiAgcmVuYW1lKHNjb3JlX0YxID0gTVIxLCBzY29yZV9GMiA9IE1SMiwgc2NvcmVfRjMgPSBNUjMpICU+JQogIGZpbHRlcighaXMubmEoc2NvcmVfRjEpLCAhaXMubmEoc2NvcmVfRjIpLCAhaXMubmEoc2NvcmVfRjMpLCAhaXMubmEoYWdlKSkgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIHN0YXJ0c193aXRoKCJzY29yZV8iKSkgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IpKQoKZ2dwbG90KHNjb3Jlc19zMl9wbG90dGluZyAlPiUKICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJTb2NpYWwtZW1vdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb2RpbHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlcHR1YWwtY29nbml0aXZlIikpKSwKICAgICAgIGFlcyh4ID0gYWdlLCB5ID0gc2NvcmUsIGNvbG9yID0gY2hhcmFjdGVyLCBmaWxsID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKCJmYWN0b3IiLCBuY29sID0gMykgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgYWxwaGEgPSAwLjQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuNCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxOSwgMTUpKSArCiAgbGFicyh0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGNoaWxkcmVuJ3MgYWdlIiwKICAgICAgICMgc3VidGl0bGUgPSAiQ2hpbGRyZW4gKFN0dWR5IDIpXG4iLAogICAgICAgeCA9ICJBZ2UgKHllYXJzKSIsCiAgICAgICB5ID0gIkZhY3RvciBzY29yZSIpICMgMTAwMCBieSA1MDAKYGBgCgojIyBTdHVkaWVzIDEtMgoKYGBge3IgczEyIHNjYXR0ZXIgcGx1cyBtZWFuIHNjb3JlcyBieSBhZ2Ugc2V0dXAsIGZpZy53aWR0aCA9IDUsIGZpZy5oZWlnaHQgPSAyLjV9CnRlbXBBIDwtIGQyICU+JSAKICBzZWxlY3Qoc3ViaWQsIGFnZSwgY2hhcmFjdGVyKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlKHN1YmlkID0gcGFzdGUoY2hhcmFjdGVyLCBzdWJpZCwgc2VwID0gIl8iKSkgJT4lCiAgZnVsbF9qb2luKHNjb3Jlc19zMTIpICU+JQogIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSkgJT4lCiAgZmlsdGVyKGFnZV9ncm91cCA9PSAiY2hpbGRyZW5fNzkiLCAhaXMubmEoc2NvcmUpLCAhaXMubmEoYWdlKSkgJT4lCiAgIyBzcHJlYWQoZmFjdG9yLCBzY29yZSkgJT4lCiAgIyBmaWx0ZXIoIWlzLm5hKHNjb3JlX0YxKSwgIWlzLm5hKHNjb3JlX0YyKSwgIWlzLm5hKHNjb3JlX0YzKSwgIWlzLm5hKGFnZSkpICU+JQogICMgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIHN0YXJ0c193aXRoKCJzY29yZV8iKSkgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAjIGxhYmVscyA9IGMoIlNvY2lhbC1lbW90aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICJCb2RpbHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICJQZXJjZXB0dWFsLWNvZ25pdGl2ZSIpKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJPRFkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlORCIpKSkKCnRlbXBCIDwtIHNjb3Jlc19zMTJfcGxvdHRpbmcgJT4lCiAgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIyBsYWJlbHMgPSBjKCJTb2NpYWwtZW1vdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAiQm9kaWx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAiUGVyY2VwdHVhbC1jb2duaXRpdmUiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJIRUFSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JTkQiKSksCiAgICAgICAgIGFnZSA9IDExKSAlPiUKICBkaXN0aW5jdCgpCgpnZ3Bsb3QodGVtcEEsCiAgICAgICBhZXMoeCA9IGFnZSwgeSA9IHNjb3JlLCBjb2xvciA9IGNoYXJhY3RlciwgZmlsbCA9IGNoYXJhY3Rlciwgc2hhcGUgPSBjaGFyYWN0ZXIpKSArCiAgZmFjZXRfd3JhcCgiZmFjdG9yIiwgbmNvbCA9IDMpICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgIyBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBhbHBoYSA9IDAuNCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFscGhhID0gMC40KSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIGdlb21fcG9pbnQoZGF0YSA9IHRlbXBCICU+JSAKICAgICAgICAgICAgICAgbXV0YXRlKGZhY3RvcihmYWN0b3IpKSwgCiAgICAgICAgICAgICBhZXMoeSA9IE1lYW4pLAogICAgICAgICAgICAgc2l6ZSA9IDQsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjYpKSArCiAgZ2VvbV9lcnJvcmJhcihkYXRhID0gdGVtcEIsIGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciwgeSA9IE1lYW4pLCB3aWR0aCA9IDAuNCwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjYpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTksIDE1KSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDc6MTEpLCBsYWJlbHMgPSBjKCI3eSIsICI4eSIsICI5eSIsICIxMHkiLCAiYWR1bHRzIikpICsKICBsYWJzKCN0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGFnZSIsCiAgICAgICAjIHN1YnRpdGxlID0gIkNoaWxkcmVuIChTdHVkeSAyKVxuIiwKICAgICAgIHggPSAiQWdlIiwKICAgICAgIHkgPSAiRmFjdG9yIHNjb3JlIikgIyAxMDAwIGJ5IDUwMApgYGAKCiMjIFN0dWRpZXMgMy00CgpgYGB7ciBzMzQgZmFjdG9yIHNjb3JlcyBieSBhZ2Ugb3B0aW9uIDEgc2V0dXB9CiMgc2NvcmVzX3MzNF9wbG90dGluZyA8LSBkMyAlPiUKIyAgIHNlbGVjdChhZ2VfZ3JvdXAsIHN1YmlkLCBhZ2UsIGNoYXJhY3RlcikgJT4lCiMgICBkaXN0aW5jdCgpICU+JQojICAgbXV0YXRlKHN1YmlkID0gcGFzdGUoY2hhcmFjdGVyLCBzdWJpZCwgc2VwID0gIl8iKSkgJT4lCiMgICBmdWxsX2pvaW4oZDQgJT4lCiMgICAgICAgICAgICAgICBzZWxlY3QoYWdlX2dyb3VwLCBzdWJpZCwgYWdlLCBjaGFyYWN0ZXIpICU+JQojICAgICAgICAgICAgICAgZGlzdGluY3QoKSAlPiUKIyAgICAgICAgICAgICAgIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpKSAlPiUKIyAgIGZ1bGxfam9pbihlZmFfZDM0X2FsbF9yb3RhdGVkTiRzY29yZXMgJT4lCiMgICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lCiMgICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikpICU+JQojICAgbXV0YXRlKGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIpKSAlPiUKIyAgIG11dGF0ZShhZ2UgPSBpZmVsc2UoYWdlIDwgMy41LCBOQSwgYWdlKSkgJT4lCiMgICByZW5hbWUoc2NvcmVfRjEgPSBNUjEsIHNjb3JlX0YyID0gTVIyLCBzY29yZV9GMyA9IE1SMykgJT4lCiMgICBmaWx0ZXIoIWlzLm5hKHNjb3JlX0YxKSwgIWlzLm5hKHNjb3JlX0YyKSwgIWlzLm5hKHNjb3JlX0YzKSwgIWlzLm5hKGFnZSkpICU+JQojICAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIHN0YXJ0c193aXRoKCJzY29yZV8iKSkgJT4lCiMgICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvcikpCmBgYAoKYGBge3IgczM0IGZhY3RvciBzY29yZXMgYnkgYWdlIG9wdGlvbiAyIHNldHVwfQojIHByb2plY3QgNC02eW8gZGF0YSBpbnRvIDctOXlvIHNwYWNlCnRlbXBfcHJlZGljdCA8LSBwcmVkaWN0KGVmYV9kM19hbGxfcm90YXRlZE4sIGQ0X2FsbCwgZDNfYWxsKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpCiMgcm91bmQoY29yKGVmYV9kNF9hbGxfcm90YXRlZE4kc2NvcmVzLCB0ZW1wX3ByZWRpY3QsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKSwgMykKCnRlbXBfY29tYm8gPC0gZWZhX2QzX2FsbF9yb3RhdGVkTiRzY29yZXMgJT4lIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lCiAgZnVsbF9qb2luKHRlbXBfcHJlZGljdCkKCnNjb3Jlc19zMzRfcGxvdHRpbmcgPC0gZDMgJT4lCiAgc2VsZWN0KGFnZV9ncm91cCwgc3ViaWQsIGFnZSwgY2hhcmFjdGVyKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQogIGZ1bGxfam9pbihkNCAlPiUKICAgICAgICAgICAgICBzZWxlY3QoYWdlX2dyb3VwLCBzdWJpZCwgYWdlLCBjaGFyYWN0ZXIpICU+JQogICAgICAgICAgICAgIGRpc3RpbmN0KCkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKHN1YmlkID0gcGFzdGUoY2hhcmFjdGVyLCBzdWJpZCwgc2VwID0gIl8iKSkpICU+JQogIGZ1bGxfam9pbih0ZW1wX2NvbWJvKSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlcikpICU+JQogIG11dGF0ZShhZ2UgPSBpZmVsc2UoYWdlIDwgMy41LCBOQSwgYWdlKSkgJT4lCiAgcmVuYW1lKHNjb3JlX0YxID0gTVIxLCBzY29yZV9GMiA9IE1SMiwgc2NvcmVfRjMgPSBNUjMpICU+JQogIGZpbHRlcighaXMubmEoc2NvcmVfRjEpLCAhaXMubmEoc2NvcmVfRjIpLCAhaXMubmEoc2NvcmVfRjMpLCAhaXMubmEoYWdlKSkgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIHN0YXJ0c193aXRoKCJzY29yZV8iKSkgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IpKQpgYGAKCmBgYHtyIHMzNCBmYWN0b3Igc2NvcmVzIGJ5IGFnZSBwbG90LCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDV9CiMgZ2dwbG90KHNjb3Jlc19zMzRfcGxvdHRpbmcgJT4lCiMgICAgICAgICAgdW5ncm91cCgpICU+JQojICAgICAgICAgIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygic2NvcmVfRjEiLCAic2NvcmVfRjIiLCAic2NvcmVfRjMiKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkhlYXJ0IiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbmQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9keSIpKSwKIyAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwgImRvbGwiLCAidGVkZHlfYmVhciIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWV0bGUiLCAiYmlyZCIsICJtb3VzZSIsICJnb2F0IiwgImVsZXBoYW50IikpKSwKIyAgICAgICAgIyBhZXMoeCA9IGFnZSwgeSA9IHNjb3JlLCBjb2xvciA9IGNoYXJhY3RlciwgZmlsbCA9IGNoYXJhY3Rlciwgc2hhcGUgPSBjaGFyYWN0ZXIpKSArCiMgICAgICAgIGFlcyh4ID0gYWdlLCB5ID0gc2NvcmUsIGdyb3VwID0gYWdlX2dyb3VwKSkgKwojICAgIyBmYWNldF93cmFwKCJmYWN0b3IiLCBuY29sID0gMykgKwojICAgZmFjZXRfZ3JpZChmYWN0b3IgfiBjaGFyYWN0ZXIpICsKIyAgICMgZmFjZXRfZ3JpZChjaGFyYWN0ZXIgfiBmYWN0b3IpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiMgICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIGFscGhhID0gMC40KSArCiMgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuNCkgKwojICAgIyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuNCwgZm9ybXVsYSA9IHkgfiBwb2x5KHgsIDIpKSArCiMgICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFscGhhID0gMC40LCBmb3JtdWxhID0geSB+IHBvbHkoeCwgMykpICsKIyAgIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMiwgMTIsIDIpKSArCiMgICAjIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgIiMwMEJGQzQiLCByZXAoImdyYXkiLCAyKSwgIiNGODc2NkQiLCByZXAoImJsYWNrIiwgNCkpKSArCiMgICAjIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICIjMDBCRkM0IiwgcmVwKCJncmF5IiwgMiksICIjRjg3NjZEIiwgcmVwKCJibGFjayIsIDQpKSkgKwojICAgIyBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNywgMTUsIHJlcCgxNywgMiksIDE5LCByZXAoMTcsIDQpKSkgKwojICAgbGFicyh0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGNoaWxkcmVuJ3MgYWdlIiwKIyAgICAgICAgIyBzdWJ0aXRsZSA9ICJDaGlsZHJlbiAoU3R1ZGllcyAzLTQpXG4iLAojICAgICAgICB4ID0gIkFnZSAoeWVhcnMpIiwKIyAgICAgICAgeSA9ICJGYWN0b3Igc2NvcmUiKSAjIDEwMDAgYnkgNTAwCiMgCiMgCmdncGxvdChzY29yZXNfczM0X3Bsb3R0aW5nICU+JQogICAgICAgICB1bmdyb3VwKCkgJT4lCiAgICAgICAgIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInNjb3JlX0YxIiwgInNjb3JlX0YzIiwgInNjb3JlX0YyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQk9EWSIsICJIRUFSVCIsICJNSU5EIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWxzID0gYygic2NvcmVfRjEiLCAic2NvcmVfRjIiLCAic2NvcmVfRjMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxhYmVscyA9IGMoIkhlYXJ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIk1pbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAiQm9keSIpKSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IGZhY3Rvcihnc3ViKCJfIiwgIiAiLCBjaGFyYWN0ZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwgImRvbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlZGR5IGJlYXIiLCAiYmVldGxlIiwgImJpcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIiwgImdvYXQiLCAiZWxlcGhhbnQiKSksCiAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNoaWxkcmVuXzQ2IiwgImNoaWxkcmVuXzc5IikpKSwKICAgICAgIGFlcyh4ID0gYWdlLCB5ID0gc2NvcmUpKSArCiAgICAgICAjIGFlcyh4ID0gYWdlLCB5ID0gc2NvcmUsIGdyb3VwID0gYWdlX2dyb3VwKSkgKwogICMgZmFjZXRfd3JhcCgiZmFjdG9yIiwgbmNvbCA9IDMpICsKICBmYWNldF9ncmlkKGZhY3RvciB+IGNoYXJhY3RlcikgKwogICMgZmFjZXRfZ3JpZChjaGFyYWN0ZXIgfiBmYWN0b3IpICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIGFscGhhID0gMC40KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjIsIGNvbG9yID0gImJsYWNrIikgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjQsIGZvcm11bGEgPSB5IH4gcG9seSh4LCAyKSkgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjQsIGZvcm11bGEgPSB5IH4gcG9seSh4LCAzKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGFlcyhjb2xvciA9IGFnZV9ncm91cCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIsIDEyLCAyKSkgKwogICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiIzAwQkZDNCIsIHJlcCgiZ3JheSIsIDIpLCAiI0Y4NzY2RCIsIHJlcCgiYmxhY2siLCA0KSkpICsKICAjIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICIjMDBCRkM0IiwgcmVwKCJncmF5IiwgMiksICIjRjg3NjZEIiwgcmVwKCJibGFjayIsIDQpKSkgKwogICMgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTcsIDE1LCByZXAoMTcsIDIpLCAxOSwgcmVwKDE3LCA0KSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIoIkFnZSBncm91cCIsIGxhYmVscyA9IGMoIjQtNnkiLCAiNy05eSIpLAogICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIGxhYnMoI3RpdGxlID0gIkZhY3RvciBzY29yZXMgYnkgY2hpbGRyZW4ncyBhZ2UiLAogICAgICAgIyBzdWJ0aXRsZSA9ICJDaGlsZHJlbiAoU3R1ZGllcyAzLTQpXG4iLAogICAgICAgeCA9ICJBZ2UgKHllYXJzKSIsCiAgICAgICB5ID0gIkZhY3RvciBzY29yZSIpICMgMTAwMCBieSA1MDAKYGBgCgpgYGB7cn0KY29udHJhc3RzKHNjb3Jlc19zMzRfcGxvdHRpbmckZmFjdG9yKSA8LSAKICBjYmluZChoZWFydCA9IGMoMSwgMCwgLTEpLAogICAgICAgIG1pbmQgPSBjKDAsIDEsIC0xKSkKY29udHJhc3RzKHNjb3Jlc19zMzRfcGxvdHRpbmckY2hhcmFjdGVyKSA8LSAKICBjYmluZChhbmltYXRlID0gYyg1LCA1LCAtNCwgLTQsIDUsIDUsIDUsIC00LCAtNCksCiAgICAgICAgbWFtbWFsID0gYygtMywgLTMsIDAsIDAsIDIsIDIsIDIsIDAsIDApLAogICAgICAgIGVsZXBoYW50ID0gYygwLCAwLCAwLCAwLCAyLCAtMSwgLTEsIDAsIDApLAogICAgICAgIGdvYXQgPSBjKDAsIDAsIDAsIDAsIDAsIDEsIC0xLCAwLCAwKSwKICAgICAgICBiaXJkID0gYygtMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCksCiAgICAgICAgdGVjaCA9IGMoMCwgMCwgMSwgLTEsIDAsIDAsIDAsIDEsIC0xKSwKICAgICAgICByb2JvdCA9IGMoMCwgMCwgLTEsIDAsIDAsIDAsIDAsIDEsIDApLAogICAgICAgIHRlZGR5ID0gYygwLCAwLCAwLCAtMSwgMCwgMCwgMCwgMCwgMSkpCgojIHJlZ190ZW1wIDwtIGxtZXIoc2NvcmUgfiBmYWN0b3IgKiBjaGFyYWN0ZXIgKiBzY2FsZShhZ2UsIHNjYWxlID0gRikgKyAoMSB8IGNoYXJhY3RlcikgKyAoMSB8IHN1YmlkKSwgZGF0YSA9IHNjb3Jlc19zMzRfcGxvdHRpbmcpCgojIHN1bW1hcnkocmVnX3RlbXApCgpwdmFscyA8LSBkYXRhLmZyYW1lKCkKZm9yKGkgaW4gbGV2ZWxzKHNjb3Jlc19zMzRfcGxvdHRpbmckY2hhcmFjdGVyKSkgewogIGZvcihqIGluIGxldmVscyhzY29yZXNfczM0X3Bsb3R0aW5nJGZhY3RvcikpIHsKICAgIHJlcyA8LSBzdW1tYXJ5KGxtKHNjb3JlIH4gc2NhbGUoYWdlLCBzY2FsZSA9IEYpLAogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNjb3Jlc19zMzRfcGxvdHRpbmcgJT4lIGZpbHRlcihjaGFyYWN0ZXIgPT0gaSwgZmFjdG9yID09IGopKSkKICAgIHAgPC0gcm91bmQocmVzJGNvZWZmaWNpZW50c1syLCA0XSwgMykKICAgIHB2YWxzW2ksIGpdIDwtIHAKICB9Cn0KCnB2YWxzIDwtIHB2YWxzICU+JSAKICBzZWxlY3Qoc2NvcmVfRjMsIHNjb3JlX0YxLCBzY29yZV9GMikgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJjaGFyYWN0ZXIiKSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb21wdXRlciIsICJyb2JvdCIsICJkb2xsIiwgInRlZGR5X2JlYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVldGxlIiwgImJpcmQiLCAibW91c2UiLCAiZ29hdCIsICJlbGVwaGFudCIpKSkgJT4lCiAgYXJyYW5nZShjaGFyYWN0ZXIpCgpwdmFscwoKcHZhbHMgJT4lIAogIGdhdGhlcihmYWN0b3IsIHAsIC1jaGFyYWN0ZXIpICU+JQogIGZpbHRlcihwIDwgMC4wNS8obnJvdyhwdmFscykgKiBuY29sKHB2YWxzKSkpICU+JQogIHNwcmVhZChmYWN0b3IsIHApCgpwdmFsc19jYXQgPC0gZGF0YS5mcmFtZSgpCmZvcihpIGluIGxldmVscyhzY29yZXNfczM0X3Bsb3R0aW5nJGNoYXJhY3RlcikpIHsKICBmb3IoaiBpbiBsZXZlbHMoc2NvcmVzX3MzNF9wbG90dGluZyRmYWN0b3IpKSB7CiAgICByZXMgPC0gc3VtbWFyeShsbShzY29yZSB+IGFnZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzY29yZXNfczM0X3Bsb3R0aW5nICU+JSBmaWx0ZXIoY2hhcmFjdGVyID09IGksIGZhY3RvciA9PSBqKSkpCiAgICBwIDwtIHJvdW5kKHJlcyRjb2VmZmljaWVudHNbMiwgNF0sIDMpCiAgICBwdmFsc19jYXRbaSwgal0gPC0gcAogIH0KfQoKcHZhbHNfY2F0IDwtIHB2YWxzX2NhdCAlPiUgCiAgc2VsZWN0KHNjb3JlX0YzLCBzY29yZV9GMSwgc2NvcmVfRjIpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2hhcmFjdGVyIikgJT4lCiAgbXV0YXRlKGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY29tcHV0ZXIiLCAicm9ib3QiLCAiZG9sbCIsICJ0ZWRkeV9iZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZXRsZSIsICJiaXJkIiwgIm1vdXNlIiwgImdvYXQiLCAiZWxlcGhhbnQiKSkpICU+JQogIGFycmFuZ2UoY2hhcmFjdGVyKQoKcHZhbHNfY2F0CgpwdmFsc19jYXQgJT4lIAogIGdhdGhlcihmYWN0b3IsIHAsIC1jaGFyYWN0ZXIpICU+JQogIGZpbHRlcihwIDwgMC4wNS8obnJvdyhwdmFsc19jYXQpICogbmNvbChwdmFsc19jYXQpKSkgJT4lCiAgc3ByZWFkKGZhY3RvciwgcCkKYGBgCgpgYGB7ciBzMzQgY29ycmVsYXRpb25zfQpnZ3Bsb3Qoc2NvcmVzX3MzNF9wbG90dGluZyAlPiUKICAgICAgICAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygic2NvcmVfRjEiLCAic2NvcmVfRjMiLCAic2NvcmVfRjIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkpICU+JQogICAgICAgICBzcHJlYWQoZmFjdG9yLCBzY29yZSksCiAgICAgICBhZXMoeCA9IEJPRFksIHkgPSBIRUFSVCwgCiAgICAgICAgICAgY29sb3IgPSBhZ2VfZ3JvdXAsIGZpbGwgPSBhZ2VfZ3JvdXAsIGdyb3VwID0gYWdlX2dyb3VwKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjIpICsKICB0aGVtZV9idygpCgpnZ3Bsb3Qoc2NvcmVzX3MzNF9wbG90dGluZyAlPiUKICAgICAgICAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygic2NvcmVfRjEiLCAic2NvcmVfRjMiLCAic2NvcmVfRjIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkpICU+JQogICAgICAgICBzcHJlYWQoZmFjdG9yLCBzY29yZSksCiAgICAgICBhZXMoeCA9IEJPRFksIHkgPSBNSU5ELCAKICAgICAgICAgICBjb2xvciA9IGFnZV9ncm91cCwgZmlsbCA9IGFnZV9ncm91cCwgZ3JvdXAgPSBhZ2VfZ3JvdXApKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuMikgKwogIHRoZW1lX2J3KCkKCmdncGxvdChzY29yZXNfczM0X3Bsb3R0aW5nICU+JQogICAgICAgICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJzY29yZV9GMSIsICJzY29yZV9GMyIsICJzY29yZV9GMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkJPRFkiLCAiSEVBUlQiLCAiTUlORCIpKSkgJT4lCiAgICAgICAgIHNwcmVhZChmYWN0b3IsIHNjb3JlKSwKICAgICAgIGFlcyh4ID0gSEVBUlQsIHkgPSBNSU5ELCAKICAgICAgICAgICBjb2xvciA9IGFnZV9ncm91cCwgZmlsbCA9IGFnZV9ncm91cCwgZ3JvdXAgPSBhZ2VfZ3JvdXApKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuMikgKwogIHRoZW1lX2J3KCkKCnNjb3Jlc19zMzRfcGxvdHRpbmcgJT4lCiAgZmlsdGVyKGFnZV9ncm91cCA9PSAiY2hpbGRyZW5fNzkiKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInNjb3JlX0YxIiwgInNjb3JlX0YzIiwgInNjb3JlX0YyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkpICU+JQogIHNwcmVhZChmYWN0b3IsIHNjb3JlKSAlPiUKICBzZWxlY3QoQk9EWSwgSEVBUlQsIE1JTkQpICU+JQogIGNvcigpCgpzY29yZXNfczM0X3Bsb3R0aW5nICU+JQogIGZpbHRlcihhZ2VfZ3JvdXAgPT0gImNoaWxkcmVuXzQ2IikgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJzY29yZV9GMSIsICJzY29yZV9GMyIsICJzY29yZV9GMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQk9EWSIsICJIRUFSVCIsICJNSU5EIikpKSAlPiUKICBzcHJlYWQoZmFjdG9yLCBzY29yZSkgJT4lCiAgc2VsZWN0KEJPRFksIEhFQVJULCBNSU5EKSAlPiUKICBjb3IoKQpgYGAKCmBgYHtyfQpzY29yZXNfczM0X2xtIDwtIHNjb3Jlc19zMzRfcGxvdHRpbmcgJT4lCiAgZmlsdGVyKGFnZV9ncm91cCA9PSAiY2hpbGRyZW5fNDYiKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInNjb3JlX0YxIiwgInNjb3JlX0YzIiwgInNjb3JlX0YyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkpICU+JQogIHNwcmVhZChmYWN0b3IsIHNjb3JlKQoKc3VtbWFyeShsbWVyKEhFQVJUIH4gQk9EWSAqIHNjYWxlKGFnZSwgc2NhbGUgPSBGKSArICgxIHwgY2hhcmFjdGVyKSwgCiAgICAgICAgICAgICBzY29yZXNfczM0X2xtKSkKc3VtbWFyeShsbWVyKE1JTkQgfiBCT0RZICogc2NhbGUoYWdlLCBzY2FsZSA9IEYpICsgKDEgfCBjaGFyYWN0ZXIpLCAKICAgICAgICAgICAgIHNjb3Jlc19zMzRfbG0pKQpzdW1tYXJ5KGxtZXIoSEVBUlQgfiBNSU5EICogc2NhbGUoYWdlLCBzY2FsZSA9IEYpICsgKDEgfCBjaGFyYWN0ZXIpLCAKICAgICAgICAgICAgIHNjb3Jlc19zMzRfbG0pKQpgYGAKCgpgYGB7ciBzMzQgYWxsIHByb3BvcnRpb25zLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTR9CiMgcGxvdCEgKG9yZGVyZWQgYnkgc3R1ZHkgMyBmYWN0b3IgbG9hZGluZ3MpCnMzNF9hbGxfY2F0IDwtIGdncGxvdChkMzRfYWxsICU+JQogICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdWJpZCA9IGdzdWIoIi4qXyIsICIiLCBzdWJpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdWJpZCwgc3R1ZHksIGNoYXJhY3RlcikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdCgpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX2pvaW4oZDQgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdWJpZCwgc3R1ZHksIGNoYXJhY3RlcikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdCgpKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9IGZhY3RvcihzdHVkeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInN0dWR5IDQiLCAic3R1ZHkgMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiNC02eSIsICI3LTl5IikpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZ2F0aGVyKGNhcGFjaXR5LCByZXNwb25zZSwgYW5ncnk6dGlyZWQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAjIGZpbHRlcighaXMubmEocmVzcG9uc2UpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9qb2luKHMzNF9wbG90dGluZyAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBzM19mYWN0b3IsIHMzX29yZGVyKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihjaGFyX3Bsb3R0aW5nX3dvcmRpbmdzKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHdvcmRpbmcgPSByZW9yZGVyKHdvcmRpbmcsIHMzX29yZGVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZWxlcGhhbnQiLCAiZ29hdCIsICJtb3VzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmlyZCIsICJiZWV0bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlZGR5X2JlYXIiLCAiZG9sbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm9ib3QiLCAiY29tcHV0ZXIiKSkpLAogICAgICAgICAgICAgICBhZXMoeCA9IHN0dWR5LCAKICAgICAgICAgICAgICAgICAgIGZpbGwgPSBzdHVkeSwKICAgICAgICAgICAgICAgICAgIGFscGhhID0gZmFjdG9yKHJlc3BvbnNlKSkpICsgCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiU3R1ZHk6IiwgcGFsZXR0ZSA9ICJTZXQxIiwgZGlyZWN0aW9uID0gLTEpICsKICBzY2FsZV9hbHBoYV9kaXNjcmV0ZShuYW1lID0gIlJlc3BvbnNlOiIsIGxhYmVscyA9IGMoIk5PIiwgIktJTkRBIiwgIllFUyIpLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gMCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksCiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgbGFicyh4ID0gIlN0dWR5IiwKICAgICAgIHkgPSAiUHJvcG9ydGlvbiBvZiBSZXNwb25zZXMiKSArCiAgIyBjb29yZF9mbGlwKCkgKwogIGZhY2V0X2dyaWQoY2hhcmFjdGVyIH4gd29yZGluZywKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIod29yZGluZyA9IGxhYmVsX3dyYXBfZ2VuKDEwKSkpCiAgIyBmYWNldF93cmFwKH4gd29yZGluZywgbmNvbCA9IDUpCgpzMzRfYWxsX2NhdApgYGAKCmBgYHtyIHMzNCByb2JvdCBwcm9wb3J0aW9ucywgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KIyBwbG90ISAob3JkZXJlZCBieSBzdHVkeSAzIGZhY3RvciBsb2FkaW5ncykKczM0X3JvYm90X2NhdCA8LSBnZ3Bsb3QoZDM0X2FsbCAlPiUKICAgICAgICAgICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihncmVwbCgicm9ib3QiLCBzdWJpZCkpICU+JQogICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN1YmlkID0gZ3N1Yigicm9ib3RfIiwgIiIsIHN1YmlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCkpICU+JQogICAgICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKGQzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdWJpZCwgc3R1ZHkpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCkpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0KCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX2pvaW4oZDQgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Qoc3ViaWQsIHN0dWR5KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSkpICU+JQogICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0dWR5ID0gZmFjdG9yKHN0dWR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInN0dWR5IDQiLCAic3R1ZHkgMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjQtNnkiLCAiNy05eSIpKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICBnYXRoZXIoY2FwYWNpdHksIHJlc3BvbnNlLCBhbmdyeTp0aXJlZCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICBmdWxsX2pvaW4oczM0X3Bsb3R0aW5nICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgd29yZGluZywgczNfZmFjdG9yLCBzM19vcmRlcikpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUod29yZGluZyA9IHJlb3JkZXIod29yZGluZywgczNfb3JkZXIpKSwKICAgICAgICAgICAgICAgYWVzKHggPSBzdHVkeSwgCiAgICAgICAgICAgICAgICAgICBmaWxsID0gc3R1ZHksCiAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGZhY3RvcihyZXNwb25zZSkpKSArIAogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIlN0dWR5OiIsIHBhbGV0dGUgPSAiU2V0MSIsIGRpcmVjdGlvbiA9IC0xKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUobmFtZSA9ICJSZXNwb25zZToiLCBsYWJlbHMgPSBjKCJOTyIsICJLSU5EQSIsICJZRVMiKSwKICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9IDApICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLAogICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIGxhYnMoeCA9ICJTdHVkeSIsCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgUmVzcG9uc2VzIikgKwogICMgY29vcmRfZmxpcCgpICsKICAjIGZhY2V0X2dyaWQoY2FwYWNpdHkgfiAuLCBzd2l0Y2ggPSAieSIpCiAgZmFjZXRfd3JhcCh+IHdvcmRpbmcsIG5jb2wgPSA1KQoKczM0X3JvYm90X2NhdApgYGAKCmBgYHtyIGtpbmRhLCBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3Bsb3QoZDNfYWxsICU+JQogICAgICAgICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lCiAgICAgICAgIGdhdGhlcihjYXBhY2l0eSwgcmVzcG9uc2UsIC1zdWJpZCkgJT4lCiAgICAgICAgIG11dGF0ZShhZ2VfZ3JvdXAgPSAiNy05eSIpICU+JQogICAgICAgICBmdWxsX2pvaW4oZDRfYWxsICU+JQogICAgICAgICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lCiAgICAgICAgICAgICAgICAgICAgIGdhdGhlcihjYXBhY2l0eSwgcmVzcG9uc2UsIC1zdWJpZCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShhZ2VfZ3JvdXAgPSAiNC02eSIpKSAlPiUKICAgICAgICAgbXV0YXRlKHJlc3BvbnNlX2NhdCA9IGZhY3RvcihyZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDAsIDAuNSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygibm8iLCAia2luZGEiLCAieWVzIikpKSwKICAgICAgIGFlcyh4ID0gYWdlX2dyb3VwLAogICAgICAgICAgIGZpbGwgPSBhZ2VfZ3JvdXAsCiAgICAgICAgICAgYWxwaGEgPSByZXNwb25zZV9jYXQpKSArIAogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIlN0dWR5OiIsIHBhbGV0dGUgPSAiU2V0MSIsIGRpcmVjdGlvbiA9IC0xKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUobmFtZSA9ICJSZXNwb25zZToiLCBsYWJlbHMgPSBjKCJOTyIsICJLSU5EQSIsICJZRVMiKSwKICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9IDApICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLAogICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIGxhYnMoeCA9ICJTdHVkeSIsCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgUmVzcG9uc2VzIikKYGBgCgpgYGB7ciB0cmVhdCBraW5kYSBhcyB5ZXN9CiMgNy05eQpkM19hbGwgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUgZ2F0aGVyKGtleSwgdmFsdWUsIC1zdWJpZCkgJT4lIG11dGF0ZSh2YWx1ZSA9IGFzLm51bWVyaWMoZ3N1YigwLjUsIDEsIHZhbHVlKSkpICU+JSBzcHJlYWQoa2V5LCB2YWx1ZSkgJT4lIHJlbW92ZV9yb3duYW1lcygpICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikgJT4lIGZhKG5mYWN0b3JzID0gNiwgcm90YXRlID0gIm5vbmUiLCBmbSA9ICJtaW5yZXMiKSAlPiUgZmEuc29ydCgpCgpkM19hbGwgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUgZ2F0aGVyKGtleSwgdmFsdWUsIC1zdWJpZCkgJT4lIG11dGF0ZSh2YWx1ZSA9IGFzLm51bWVyaWMoZ3N1YigwLjUsIDEsIHZhbHVlKSkpICU+JSBzcHJlYWQoa2V5LCB2YWx1ZSkgJT4lIHJlbW92ZV9yb3duYW1lcygpICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikgJT4lIGZhKG5mYWN0b3JzID0gMywgcm90YXRlID0gIm9ibGltaW4iLCBmbSA9ICJtaW5yZXMiKSAlPiUgZmEuc29ydCgpCgoKIyA0LTZ5CmQ0X2FsbCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JSBnYXRoZXIoa2V5LCB2YWx1ZSwgLXN1YmlkKSAlPiUgbXV0YXRlKHZhbHVlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgMSwgdmFsdWUpKSkgJT4lIHNwcmVhZChrZXksIHZhbHVlKSAlPiUgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKSAlPiUgZmEobmZhY3RvcnMgPSA2LCByb3RhdGUgPSAibm9uZSIsIGZtID0gIm1pbnJlcyIpICU+JSBmYS5zb3J0KCkKCmQ0X2FsbCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JSBnYXRoZXIoa2V5LCB2YWx1ZSwgLXN1YmlkKSAlPiUgbXV0YXRlKHZhbHVlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgMSwgdmFsdWUpKSkgJT4lIHNwcmVhZChrZXksIHZhbHVlKSAlPiUgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKSAlPiUgZmEobmZhY3RvcnMgPSAyLCByb3RhdGUgPSAib2JsaW1pbiIsIGZtID0gIm1pbnJlcyIpICU+JSBmYS5zb3J0KCkKYGBgCgpgYGB7ciBvbWl0IGtpbmRhfQojIDctOXkKZDNfYWxsICU+JSByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lIGdhdGhlcihrZXksIHZhbHVlLCAtc3ViaWQpICU+JSBtdXRhdGUodmFsdWUgPSBhcy5udW1lcmljKGdzdWIoMC41LCBOQSwgdmFsdWUpKSkgJT4lIHNwcmVhZChrZXksIHZhbHVlKSAlPiUgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKSAlPiUgZmEobmZhY3RvcnMgPSA2LCByb3RhdGUgPSAibm9uZSIsIGZtID0gIm1pbnJlcyIpICU+JSBmYS5zb3J0KCkKCmQzX2FsbCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JSBnYXRoZXIoa2V5LCB2YWx1ZSwgLXN1YmlkKSAlPiUgbXV0YXRlKHZhbHVlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgTkEsIHZhbHVlKSkpICU+JSBzcHJlYWQoa2V5LCB2YWx1ZSkgJT4lIHJlbW92ZV9yb3duYW1lcygpICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikgJT4lIGZhKG5mYWN0b3JzID0gMywgcm90YXRlID0gIm9ibGltaW4iLCBmbSA9ICJtaW5yZXMiKSAlPiUgZmEuc29ydCgpCgoKIyA0LTZ5CmQ0X2FsbCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JSBnYXRoZXIoa2V5LCB2YWx1ZSwgLXN1YmlkKSAlPiUgbXV0YXRlKHZhbHVlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgTkEsIHZhbHVlKSkpICU+JSBzcHJlYWQoa2V5LCB2YWx1ZSkgJT4lIHJlbW92ZV9yb3duYW1lcygpICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikgJT4lIGZhKG5mYWN0b3JzID0gNiwgcm90YXRlID0gIm5vbmUiLCBmbSA9ICJtaW5yZXMiKSAlPiUgZmEuc29ydCgpCgpkNF9hbGwgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUgZ2F0aGVyKGtleSwgdmFsdWUsIC1zdWJpZCkgJT4lIG11dGF0ZSh2YWx1ZSA9IGFzLm51bWVyaWMoZ3N1YigwLjUsIE5BLCB2YWx1ZSkpKSAlPiUgc3ByZWFkKGtleSwgdmFsdWUpICU+JSByZW1vdmVfcm93bmFtZXMoKSAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJpZCIpICU+JSBmYShuZmFjdG9ycyA9IDIsIHJvdGF0ZSA9ICJvYmxpbWluIiwgZm0gPSAibWlucmVzIikgJT4lIGZhLnNvcnQoKQpgYGA=